Php 递归地将特定值链接在一起,而不通过引用传递数组

Php 递归地将特定值链接在一起,而不通过引用传递数组,php,arrays,recursion,multidimensional-array,Php,Arrays,Recursion,Multidimensional Array,想象一下以下多维数组: $a = array( 'key' => 'hello', 'children' => array( array( 'key' => 'sub-1' ), array( 'key' => 'sub-2', 'children' => array( array( 'key' => 'sub-sub-1' )

想象一下以下多维数组:

$a = array(
  'key' => 'hello',
  'children' => array(
    array(
      'key' => 'sub-1'
    ),
    array(
      'key' => 'sub-2',
      'children' => array(
        array(
          'key' => 'sub-sub-1'
        )
      )
    )
  )
);
我需要一个递归地运行在这样一个数组中的函数,然后使用粘合字符串返回某个子键的所有值的链

function collectKeyChain(array $array, $key, $parentKey, $glue){
  foreach($array as $k => $v){
    if(is_array($v[$parentKey]))
      $children=self::collectKeyChain($v[$parentKey], $key, $parentKey, $glue, $out);
    $chain[]=$glue . implode($glue, $children);
  }
  return $chain;
}
这样称呼:

collectValueChain($a, 'key', 'children', '/');
然后应返回以下内容:

array(
  'hello',
  'hello/sub-1',
  'hello/sub-2',
  'hello/sub-2/sub-sub-1'
)
不幸的是,我的大脑似乎完全无法完成“嵌套思维”的任务。上面函数中提供的代码不起作用,只是因为它没有意义。我可以使用递归函数返回数组或字符串。但在最终输出中,我需要一个数组。另一方面,我需要将元素链接在一起

这就是困境。我脑海中出现的唯一解决方案是使用另一个参数,通过引用传递,这是一个填充了结果的数组

像这样:

collectValueChain($a, 'key', 'children', '/', $arrayToBeFilledWithResults);
但如果不使用多个函数,我甚至无法完成这项工作

也许这件事再简单不过了,但我还是想找出答案。

试试这个:

function collectKeyChain(array $array, $key, $parentKey, $glue) {
    $return = array();
    foreach ($array as $k => $v) {
        if ($k == $key) {
            $base = $v;
            $return[] = $base;
        } elseif ($k == $parentKey && is_array($v)) {
            foreach ($v as $_v) {
                $children = collectKeyChain($_v, $key, $parentKey, $glue);
                foreach ($children as $child) {
                    $return[] = $base . $glue . $child;
                }
            }
        }
    }
    return $return;
}

请注意,如果这是类中的静态方法,则必须将self::添加到递归方法调用中。

一个更简单的版本,无需大量foreach。考虑第二种方法:

collectValueChain($a, 'key', 'children', '/', $arrayToBeFilledWithResults);
我这样做:

function  collectValueChain($a, $keyname, $parent, $glue, &$rtn, $pre="") {
  $_pre = "";
  if ($a[$keyname]) {
    $rtn[] = $_pre = $pre.$glue.$a[$keyname];        
  }
  if ($a[$parent]) {
    if(is_array($a[$parent])) {
      foreach($a[$parent] as $c)
        collectValueChain($c, $keyname, $parent, $glue, $rtn, $_pre );
    } else {
      collectValueChain(a[$parent], $keyname, $parent, $glue, $rtn, $_pre );
    }
  }
  $qtd = count($rtn);
  return $rtn[-1];
}

这正是我想要的!非常感谢。你的功能运行得很好。除了为自己无法编写而感到羞愧之外,我还发现当遇到嵌套在第一级的数组时,它将拒绝提供任何结果。我正在尝试对其进行调整。如果您的意思是将类似于数组($a)的内容传递给collectKeyChain(),那么这不应该由函数处理,而应该由函数调用的位置来处理。这样,您就可以清除函数中不必要的逻辑。例如,您可以为此编写一个单独的cleanKeyChainArray()。是的,我就快到了。有趣的是,我试着用
reset($array)
$array=$array['children']
来填充它,这就是它无法工作的原因。当然,有一次我刚刚给它输入了
reset($array)
它工作得非常好。再次感谢。我使用一个变量来存储值来实现您的第二个建议,这是下面的第二个答案。感谢您的贡献!