PHP递归搜索和替换数组元素

时间:2009-07-02 12:41:11

标签: php arrays recursion

我想以递归方式搜索和替换数组中的元素。

该数组是基于树的,所以看起来像

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,但不会搜索随后添加的子级。

我一直用这个砸我的头几个小时。请帮忙!

干杯, 暖气。

4 个答案:

答案 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;
}

谢谢你让我到那里来!