2017-04-18 1 views
4

オブジェクト私はここにいくつかの答えに目を通してきたが、それは、この方法を利用していないようですか?stdClassのためarray_walk_recursive()を使用すると、

Iは、項目の配列を有し、そしてアイテムがオブジェクトです。オブジェクトは、「子供」と「子供などのオブジェクトの配列

これを達成する方法はありますが、あるあるキーを持つことができますか?

例:

Array 
    (
     [1] => stdClass Object 
      (
       [id] => 1 
       [name] => Steve King 
       [image] => upload/shop/fe7a66254e4249af2b0093efca75a914.jpg 
       [parent] => 0 
       [children] => Array 
        (
        ) 

      ) 

     [2] => stdClass Object 
      (
       [id] => 2 
       [name] => Eden Hall 
       [image] => upload/shop/064f60a98deba612e437ac549f1dc05d.jpg 
       [parent] => 0 
       [children] =>Array 
        (
         [1] => stdClass Object 
          (
           [id] => 1 
           [name] => Steve King 
           [image] => upload/shop/fe7a66254e4249af2b0093efca75a914.jpg 
           [parent] => 0 
           [children] => Array 
            (
           ) 

        ) 
      ) 
     [3] => stdClass Object 
      (
       [id] => 3 
       [name] => Paula Johnson 
       [image] => upload/shop/1492a323090afbad07c35cf93fe6bdda.jpg 
       [parent] => 0 
       [children] => Array 
        (
        ) 

      ) 

     [4] => stdClass Object 
      (
       [id] => 4 
       [name] => Ethan Watson 
       [image] => upload/shop/677c720333af33bc58d0684d79918e03.jpg 
       [parent] => 0 
       [children] => Array 
        (
        ) 

      ) 

     [5] => stdClass Object 
      (
       [id] => 5 
       [name] => Abigail Adams 
       [image] => upload/shop/da1734277322fc3b2e84a9ddbcc2e2f1.jpg 
       [parent] => 0 
       [children] => Array 
        (
        ) 

      ) 

答えて

3

$array下オブジェクトの配列を割り当てます。

解決策1:json_encodeそれassociative arrayjsonを変換し、その後jsonとせるオブジェクトの配列。

$result=json_decode(json_encode($array),true); 
array_walk_recursive($result, function($value,$key){ 
    print_r($value); 
    print_r($key); 
}); 

解決策2:がアレイにわたって繰り返し処理及びarrayobjectを鋳造型。

array_walk($array,function(&$value,$key){ 
    $value=(array) $value; 
}); 
array_walk_recursive($array, function($value,$key){ 
    print_r($value); 
    print_r($key); 
}); 
+0

ありがとうございました。私はオブジェクトとしてそれらを維持しながらループすることはできないと思いますか? –

+0

@RyanHipkiss array_walk_recursiveは、オブジェクトではなく配列に対してのみ機能します。 –

+0

@RyanHipkissようこそ... :) –

2

特定のデータ構造に対しては、常にカスタム再帰イテレータを実装できます。より柔軟なソリューションにすることができます。たとえば:

class MyIterator extends \IteratorIterator implements 
\RecursiveIterator 
{ 
    public function hasChildren() 
    { 
     $current = $this->current(); 

     if (is_array($current) and $this->key() === 'children') { 
      return true; 
     } 

     return is_object($current); 
    } 

    public function getChildren() 
    { 
     /* $current is array (for key 'children') or \stdClass obj*/ 

     $current = $this->current(); 

     return new MyIterator(new \ArrayObject($current)); 
    } 
} 

$rii = new \RecursiveIteratorIterator(new MyIterator(new 
\ArrayObject($data))); 

foreach ($rii as $key => $value) { 
    print_r($key); 
    print_r($value); 
} 
関連する問題