我有一个对象 - 我们称之为$node
。
此对象有一个名为$node->children
的属性,它实质上以node_id => NodeObject
的形式返回子对象(节点)数组:
Array
[1] => Node object
[2] => Node object
[3] => Node object
...
这些子对象属于同一类型,因此它们也具有相同的属性......
如何收集给定节点的所有子节点和子节点ID?
我需要以某种方式走过所有子节点,但我不知道如何。现在我被array_keys($children)
困住了,但它只让我成为一级孩子。
不确定它是否重要但是这个属性来自一个神奇的__get方法,我无法用print_r看到它的内容......
答案 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);
}