2017-07-28 10 views
0

私はオブジェクトに作成したい多次元配列を持っているので、xmlとjsonの両方として出力することができます。オブジェクトに再帰的にPHP多次元配列

私はこのことを再帰的に行う方法について頭を悩ませています。私はここで見つけることができますが、まだ固執している多くの多次元の投稿を見てきました。

私は間違っていますか?私はこの出力を作成するために探しています

class Dataset 
{ 
    public $name; 
    public $attr = array(); 
    public $children = array(); 

    function __construct($name){ 
     $this->name = $name; 
    } 

    function addAttr($attr){ 
     $this->attr[] = $attr; 
    } 

    function addChildren($children){ 
     $this->children[] = $children; 
    } 
} 



$jazzy = Array(
    name => 'aaa', 
    attr => Array(
     id => 123 
    ), 
    children => Array(
     Array(
      name => 'name', 
      attr => Array(), 
      children => Array(
       'www' 
      ), 
     ), 
     Array(
      name => 'websites', 
      attr => Array(), 
      children => Array(
       Array(
        name => 'website', 
        attr => Array(
         id => 456, 
         class => 'boom' 

        ), 
        children => Array(
         Array(
          name => 'url', 
          attr => Array(), 
          children => Array(
           'www.test.com' 
          ) 
         ) 
        ) 
       ), 
       Array(
        name => 'website', 
        attr => Array(
         id => 123, 
         class => "boom" 
        ), 
        children => Array(
         Array(
          name => 'url', 
          attr => Array(), 
          children => Array(
           'www.example.com' 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

<aaa id="123"> 
    <name>www</name> 
    <websites> 
     <website id='456' class="boom"> 
      <url>www.test.com</url> 
     </website> 
     <website id='123 class="boom"> 
      <url>www.example.com</url> 
     </website> 
    </websites> 
</aaa> 

これは、あなたが、その後に使用することができ、あなたのDataSetオブジェクトへデータを解析する方法であるかもしれ

function arrayToDataset($array, $node){ 

    foreach ($array as $key => $value) { 
     $name = $array['name']; 
     $attr = $array['attr']; 
     $children = $array['children']; 

     if($key == "name"){ 
      $name = $value; 
      $node->addName($name); 
     } 
     elseif($key == "attr"){ 
      $attr = $value; 

     $node->addAttr($attr); 
     } 

     elseif($key == "children") 
     { 
      $children = $value; 
      $newNode = new Dataset(); 

      foreach($children as $k => $v) 
      { 
       $newNode = $node->addChildren($v); 
      } 
      return arrayToDataset($children, $newNode); 
     } 
    } 
} 

$node = new Dataset(); 
$thing = arrayToDataset($jazzy, $node); 
print_r($thing); 
+0

は[array_walk_recursive()](http://php.net/manual/en/function.array-walk-recursive.phpを見てみることを行うための簡単な方法があるかもしれません) 関数。 – coderodour

+0

*この関数はリーフノードにのみアクセスします* – Tristanisginger

+0

$ jazzy配列の形式が正しくない - これはコードのコピーですが、キーは引用符で囲む必要があります。コードをコピー/ペーストすることができれば助けが簡単です... – RichGoldMD

答えて

1

私のコードxmlやjsonのような他の形式で出力されます。しかし...

class Dataset 
{ 
    public $name; 
    public $attr = array(); 
    public $children = array(); 
    public $url = array(); 

    function __construct($name) 
    { 
     $this->name = $name; 
    } 

    function addAttr($attr, $value) 
    { 
     $this->attr[$attr] = $value; 
    } 

    function addChild(DataSet $child) 
    { 
     $this->children[] = $child; 
    } 

    function addUrl($url) { 
     $this->url[] = $url; 
    } 

    static function makeNode($array) 
    { 
     // $array needs to have the required elements 
     $node = new DataSet($array['name']); 
     if (isset($array['attr'])) { 
      foreach ($array['attr'] as $k => $v) { 
       if (is_scalar($v)) { 
        $node->addAttr($k, $v); 
       } 
      } 
     } 
     if (isset($array['children']) && is_array($array['children'])) { 
      foreach ($array['children'] as $c) { 
       if(is_scalar($c)) { 
        $node->addUrl($c); 
       } else { 
        $node->addChild(self::makeNode($c)); 
       } 
      } 
     } 
     return $node; 
    } 

} 

print_r(Dataset::makeNode($jazzy));