对 stdClass 对象使用 array_walk_recursive()
using array_walk_recursive() for stdClass objects
我已经浏览了这里的一些答案,但似乎没有使用这种方法?
我有一个项目数组,项目是对象。该对象可以有一个键,它是 'children' 并且 'children' 是一个对象数组等。
有办法实现吗?
示例:
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
(
)
)
在$array
下分配对象数组。
解决方案1: json_encode
一个对象数组使其成为json
,然后将json
转换为associative array
.
$result=json_decode(json_encode($array),true);
array_walk_recursive($result, function($value,$key){
print_r($value);
print_r($key);
});
解决方案 2: 遍历数组并将每个 object
类型转换为 array
.
array_walk($array,function(&$value,$key){
$value=(array) $value;
});
array_walk_recursive($array, function($value,$key){
print_r($value);
print_r($key);
});
您始终可以为特定数据结构实现自定义递归迭代器。它可以是一个更灵活的解决方案。例如:
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);
}
我已经浏览了这里的一些答案,但似乎没有使用这种方法?
我有一个项目数组,项目是对象。该对象可以有一个键,它是 'children' 并且 'children' 是一个对象数组等。
有办法实现吗?
示例:
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
(
)
)
在$array
下分配对象数组。
解决方案1: json_encode
一个对象数组使其成为json
,然后将json
转换为associative array
.
$result=json_decode(json_encode($array),true);
array_walk_recursive($result, function($value,$key){
print_r($value);
print_r($key);
});
解决方案 2: 遍历数组并将每个 object
类型转换为 array
.
array_walk($array,function(&$value,$key){
$value=(array) $value;
});
array_walk_recursive($array, function($value,$key){
print_r($value);
print_r($key);
});
您始终可以为特定数据结构实现自定义递归迭代器。它可以是一个更灵活的解决方案。例如:
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);
}