物业的递归

时间:2012-02-08 01:09:08

标签: php arrays recursion

我有一个对象 - 我们称之为$node

此对象有一个名为$node->children的属性,它实质上以node_id => NodeObject的形式返回子对象(节点)数组:

Array
  [1]  => Node object
  [2]  => Node object
  [3]  => Node object
  ...

这些子对象属于同一类型,因此它们也具有相同的属性......

如何收集给定节点的所有子节点和子节点ID?

我需要以某种方式走过所有子节点,但我不知道如何。现在我被array_keys($children)困住了,但它只让我成为一级孩子。

不确定它是否重要但是这个属性来自一个神奇的__get方法,我无法用print_r看到它的内容......

5 个答案:

答案 0 :(得分:3)

function walknode($node) {
  //Do some stuff with the node here, e.g.
  echo "I am working on node $node->name<br>\n";

  if (is_array($node->children)) 
    foreach ($node->children as $child)
       walknode($child);
}

walknode($basenode);

答案 1 :(得分:1)

如果所有代的节点都有不同的ID,那么这应该有效:

$idArray = array();
$nodes = $node->children();
foreach ($nodes as $pKey => $parent) {
     array_push($idArray,$pKey);
     $childNodes = $parent->children();
     foreach ($childNodes as $cKey => $child) {
         array_push($idArray,$cKey);
     }
}

答案 2 :(得分:1)

尝试以下内容:

function walkNodes($node, $props = array()) {

  $props[] = $node->id;

  if(isset($node->children) && is_array($node->children)){
     foreach($node->children as $child) {
        $props = walkNodes($child, $props);
     }
  }

  return $props;
}

答案 3 :(得分:1)

将方法分配给这些对象所属的类,例如 hasChildren 。如果在array_keys($ children)的迭代期间,其中一个子节点返回true,那么你必须遍历它。

<?php

class SomeCollection {
    public $name;
    public $children = array();

    public function hasChildren()
    {
        return !empty($this->children);
    }

    public function iterate()
    {
        // process children
        foreach(array_keys($this->children) as $child) {

            // process grandchildren
            if($child->hasChildren()) {
                foreach(array_keys($child->children) as $grandchild) {
                    echo $child . ' is my child & ' .
                        $grandchild . ' is my grandchild!' . PHP_EOL;
                }
            } else  // process children without grandchildren
                echo $child . ' is my child of mine with no children of his own!';
        }
    }
}

如果您想探索一些内置工具,请查看SPL Iterators

答案 4 :(得分:0)

当我正确理解你的问题时,你可以通过以下方式获得密钥列表:

array_keys($node->children)

用于迭代使用

for ($node->children as $key => $value) {
  var_dump($key . ' => ' . $value);
}