我正在寻找一个示例,说明如何构造递归数组作为RecursiveArrayIterator的参数传递。我有一个mysql表,id,parent\u id和title:

id    parent_id   title
-----------------|-------------------
1         0      | Item 1
2         1      | Item 2
3         1      | Item 3
4         3      | Item 4
5         4      | Item 5

我想从表中创建一个数组,这个数组可以传递给RecursiveArrayIterator来构建树、菜单、选项等等。我试过使用这个“build_tree”函数https://stackoverflow.com/a/8587437/1746522从mysql表创建数组。结果数组如下所示:
array (size=2)
  0 =>
    array (size=3)
      'id' => string '1' (length=1)
      'title' => string 'Item 1' (length=6)
      'parent_id' => string '0' (length=1)
      'children' =>
        array (size=2)
          0 =>
            array (size=3)
              ...
          1 =>
            array (size=3)
              ...

但当我将结果数组传递给RecursiveArrayIterator时,它看起来很奇怪。例如,使用此功能:
$array = new RecursiveArrayIterator($tree);
$iterater = new RecursiveIteratorIterator($array);
foreach ($iterater as $key => $value) {
    $d = $iterater->getDepth();
    echo "depth=$d k=$key v=$value\n";
}

我有奇怪的和不可用的输出,比如:
depth=0 k=0 v=Array
depth=1 k=id v=1
depth=1 k=title v=Item 1
depth=1 k=parent_id v=0
depth=2 k=0 v=Array
depth=3 k=id v=2
depth=3 k=title v=Item 2
depth=3 k=parent_id v=1
depth=4 k=0 v=Array
....

深度是错误的,它遍历单个值而不是元素。可能传递给RecursiveArrayIterator的数组是“格式错误”的,应该以其他方式构造?
我希望看到这样的东西:
depth=0 k=1 v=Array
depth=1 k=2 v=Array
depth=1 k=3 v=Array

其中Array包含节点的所有值,如parent_id和title,k是mysql列id中的id。

最佳答案

默认情况下,RecursiveIteratorIterator类只显示树的“叶子”。也就是说,树上所有不是数组的东西。
您需要初始化迭代器以显示数组节点和叶。然后您只想打印那些作为数组的节点的数据。

$array = new RecursiveArrayIterator($records);
$iterater = new RecursiveIteratorIterator($array, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterater as $key => $value) {
    if (is_array($value)) {
        $d = $iterater->getDepth();
        echo "depth=$d k=$key value=$value\n";
    }
}

> depth=0 k=0 value=Array
> depth=0 k=1 value=Array
> depth=1 k=children value=Array
> depth=2 k=0 value=Array
> depth=2 k=1 value=Array

在这一点上,你会注意到有一个额外的层叫做“children”,这会扰乱你的深度计数。发生这种情况是因为节点的子节点被放入它们自己的数组中。您可以跳过打印这些行,并发出有关数组中项目的更多数据,如下所示:
foreach ($iterater as $key => $value) {
    if (is_array($value) && $key !== 'children') {
        $d = $iterater->getDepth();
        echo "depth=$d k=$key title={$value['title']}\n";
    }
}

08-18 14:30
查看更多