繁体   English   中英

理解并更正递归函数输出

[英]Understand and correct the Recursive Function output

我有以下功能可以打印设置的关键 whoes 值。

但它没有返回数组中的值,而是当我在 foreach 循环中使用 echo 打印它时,它显示了正确的执行。

$array = [
    '1' => true,
    ['2' => false, '4' => true],
    '3' => true    
];

$arraytrueElements = array_function($array);
echo "<pre>";
print_r($arraytrueElements);

function array_function($arr){
    $i=0;
    foreach($arr as $key => $val){
        if(is_array($val)){
             array_function($val);
        }else{
            if($val == true){
            $str[$key] = $key;
            echo "{$key}" .", \t";
        }
    }
    }
    return $str;
}

输出, 1, 4, 3,

Array
(
    [1] => 1
    [3] => 3
)

预期输出,

输出, 1, 4, 3,

Array
(
    [1] => 1,
    [4] => 4,
    [3] => 3
)

当我修改这行代码时, $str[$key] = array_function($val);

然后我有一个包含所有值的数组,但是如果已经在 echo 中显示并在 $str 数组中分配,为什么还要添加它。 有点像这样作为数组内部的数组元素,而不是预期的数组输出。

Array
(
    [1] => 1
    [2] => Array
        (
            [4] => 4
        )
    [3] => 3
)

您可以简单地使用array_walk_recursive循环遍历每个值/键对并仅保留所需的键:

$matches = [];
array_walk_recursive($array, function ($value, $key) use (&$matches) {
  if ($value === true) {
    $matches[] = $key;
  }
});

print_r($matches);  // [1, 4, 3]

演示: https : //3v4l.org/Ksq4F

如果你不能/不会使用诸如array_walk_recursivearray_merge类的库函数,你可以使用这样的东西:

function findKeysWithTrueValues(array $array): array
{
  $matches = [];
  foreach ($array as $key => $value) {
    if (is_array($value)) {
      foreach (findKeysWithTrueValues($value) as $match) {
        $matches[] = $match;
      }
    } elseif ($value === true) {
      $matches[] = $key;
    }
  }
  return $matches;
}

这会$matches数组中的每组键构建一个$matches数组。 如果该值是一个数组,它会通过递归调用遍历自己的匹配项并添加每个匹配项。 否则,它只会添加密钥。

演示: https : //3v4l.org/42tX2

您可能正在寻找array_merge

function array_function($arr) {
    foreach($arr as $key => $val) {
        if ( is_array($val) ) {
             $result = array_merge($result, array_function($val));
        } elseif ( $val === true ) {
            $result[$key] = $key;
        }
    }
    return $result;
}

另一种方法是将您的函数编写为一个过程,并引用结果数组:

function array_function($arr, &$result) {
    foreach($arr as $key => $val) {
        if ( is_array($val) ) {
             array_function($val, $result);
        } elseif ( $val === true ) {
            $result[$key] = $key;
        }
    }
}

$result = [];
array_function($arr, $result);

print_r($result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM