php 在不确定深度的多维数组中递归搜索值时获取所有路径索引

qhhrdooz  于 2023-04-19  发布在  PHP
关注(0)|答案(1)|浏览(102)

我有N级数组

$array = [
    [
        'id' => 67941,
        'parent_id' => 0,
        'name' => 'Requirement',
        'children' => [
            [
                'id' => 67942,
                'parent_id' => 67941,
                'name' => 'Sub Requirement',
                'children' => [
                    [
                        'id' => 67943,
                        'parent_id' => 67942,
                        'name' => 'Sub Sub Requirement',
                    ],
                ],
            ],
        ],
    ],
    //...
];

我想搜索67943-它位于数组的第三个索引级别(实际上是第五个级别)。我可以使用array_walk_recursive()来查找值是否存在,但我需要收集指向该值的索引的完整路径,例如$array[0][0][0]['id']
我不能硬编码的水平,我需要一个解决方案,可以与100级以上的数组工作。

doinxwow

doinxwow1#

我对RecursiveIteratorIterator类或它的同类没有太多的经验,但我能够修改this answer以满足您的条件需求。
在遍历数组时,如果键是“children”,则不缓存该键。
如果该值是搜索值,则捕获键的当前路径并中断循环。
我不明白为什么你想要一个$array[0][0][0]['id']的返回值,所以我只返回一个包含键的平面数组。
代码:(Demo

$needle = 67943;

$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
$result = null;
foreach ($ritit as $leafValue) {
    $path = [];
    foreach (range(0, $ritit->getDepth()) as $depth) {
        $obj = $ritit->getSubIterator($depth);
        $key = $obj->key();
        if ($key !== 'children') {
            $path[] = $key;
        }
        if ($obj->current() === $needle) {
            $result = $path;
            break 2;
        }

    }
}
var_export($result);

输出:

array (
  0 => 0,
  1 => 0,
  2 => 0,
  3 => 'id',
)

相关问题