如何使用 PHP 返回递归函数的数组


How to return array for a recursive function using PHP?

我有一个这样的多维数组:

<pre>Array
(
    [0] => Array
        (
            [id] => 52a83521-0914-4264-8fd9-07d9c601692a
            [role_id] => 2
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 54c1f5e4-b52c-4e17-b1bf-1f4616091b4e
                            [role_id] => 8
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 54c20aba-201c-40ce-b3df-22d516091b4e
                                            [role_id] => 9
                                        )
                                    [1] => Array
                                        (
                                            [id] => 54c20f4b-6e44-40ec-ae22-223a16091b4e
                                            [role_id] => 9
                                        )
                                )
                        )
                    [1] => Array
                        (
                            [id] => 54c1f8bb-ebac-466b-a83f-13a416091b4e
                            [role_id] => 8
                        )
                )
        )
)
</pre>

我需要按顺序填充此数组中的所有role_id。我尝试使用这样的递归函数:

<?php
public function tree_check($tree){
  $tree_keys = $this->_recursion($tree);
  print_r($tree_keys);
}
public function _recursion($tree){
        foreach ($tree as $n => $v)
        {
            if(isset($v['role_id'])){
               $key_arr[] = $v['role_id']; 
            }
            if (is_array($v))
                $this->_recursion($v);
        }
        return $key_arr;
    }

我期待以下输出:

<pre>
Array(
[0]=>2,
[1]=>8,
[2]=>9,
[3]=>9,
[4]=>8
)
</pre>

在这里,我无法实现预期的输出。数组的级别可能会动态变化,这就是我使用递归函数这样做的原因。

我应该如何从递归函数返回数组?

既然不知道我的数组有多深,我怎样才能找到数组的最后一个键值对呢?

您可以使用递归迭代器迭代器遍历元素:

function listRolesRecursive($myArray) {
    $res = array();
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($myArray), RecursiveIteratorIterator::SELF_FIRST);
    foreach ($iterator as $k => $v) {
        if($k === "role_id") {
            $res[] = $v;
        }
    }
    return $res;
}
$res = listRolesRecursive($arr);
var_dump($res);

它应该可以解决问题。