[英]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_recursive
或array_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.