我想以递归方式搜索和替换数组中的元素。
该数组是基于树的,所以看起来像
Object
Children
Object type A
Object type B
Object
Children
Object type A
Object
等
我希望能够用其他项替换某些项,所以例如,我想用类型B的数组替换数组A中的所有数组(在任何深度级别)。但这里是catch:新替换的对象也可能具有需要替换的A类子。
到目前为止我已经
了 foreach($nodes as &$node) {
// Replace node?
if($node['type'] == 'RefObject') {
$n = $this->site->get_node_where('id', $node['node_ref']);
// Replace node
$node = $this->site->get_node_where('object_id', $n['object_id']);
// Get children
$node['children'] = $this->site->get_descendants($node['lft'], $node['rgt']);
}
}
return $nodes;
这将取代第一级RefObject,但不会搜索随后添加的子级。
我一直用这个砸我的头几个小时。请帮忙!
干杯, 暖气。
答案 0 :(得分:8)
将您的代码放入函数中并再次调用它。伪代码:
function checkArray($array) {
...
if (is_array($node)) { // or whatever other criterium
checkArray($node); // same function
}
}
递归的基础是再次调用相同的代码......
答案 1 :(得分:2)
您需要将此代码添加到函数中并在子节点上调用该函数。
类似这样的事情(注意在函数内部再次调用parseNodes函数):
function parseNodes($node) {
foreach($nodes as &$node) {
// Replace node?
if($node['type'] == 'RefObject') {
$n = $this->site->get_node_where('id', $node['node_ref']);
// Replace node
$node = $this->site->get_node_where('object_id', $n['object_id']);
// Get children
$node['children'] = parseNodes($this->site->get_descendants($node['lft'], $node['rgt']));
}
}
return $nodes;
}
约什
答案 2 :(得分:2)
PHP 5.3获取 array_replace_recursive 方法。
我希望你能够使用它;)
http://www.php.net/manual/fr/function.array-replace-recursive.php
答案 3 :(得分:0)
这是一个递归解决方案
function makeObject($array){
$data = false;
foreach($array as $key=>$value){
if(is_array($value)){
$value = makeObject($value);
}
$data -> {$key} = $value;
}
return $data;
}
谢谢你让我到那里来!