Php 递归遍历数组会导致回调函数中的结果无效
我试图递归地迭代数组的每个元素,以获得键等于Php 递归遍历数组会导致回调函数中的结果无效,php,recursion,switch-statement,comparison,Php,Recursion,Switch Statement,Comparison,我试图递归地迭代数组的每个元素,以获得键等于page\u id或content\u id的值 问题是在回调函数中,在switch语句中,我得到了完全奇怪的行为,大小写匹配,但值不同 这让我很快发疯。我甚至尝试使用严格的比较,比如if($key=='component_id')print$key;模具()。我希望得到'component_id'作为输出,但得到'0'。这怎么可能 在写这个问题的时候,我也注意到在某个点上有索引数组时会发生这种情况,但我不确定这是否是问题所在 下面是完整解决方案的示例
page\u id
或content\u id
的值
问题是在回调函数中,在switch语句中,我得到了完全奇怪的行为,大小写匹配,但值不同
这让我很快发疯。我甚至尝试使用严格的比较,比如if($key=='component_id')print$key;模具()代码>。我希望得到'component_id'作为输出,但得到'0'。这怎么可能
在写这个问题的时候,我也注意到在某个点上有索引数组时会发生这种情况,但我不确定这是否是问题所在
下面是完整解决方案的示例代码
谢谢
<?php
class Arr
{
public static function map($array, $callback, $recursive = false)
{
foreach ($array as $key => $value) {
$array[$key] = $callback($key, $value);
if($recursive && is_array($array[$key])) {
$array[$key] = static::map($array[$key], $callback, true);
}
}
return $array;
}
}
$data = [
'id' => 12,
'data' => [
'terms' => [
[
'href' => null,
'icon' => 'lock',
'target' => '_blank'
],
[
'href' => 'http://example.com',
'icon' => 'lock',
'target' => '_blank'
]
],
'license_info' => [
'content_id' => 6
]
]
];
$contents = [];
$pages = [];
Arr::map($data, function ($key, $value) use (&$contents, &$pages) {
switch ($key) {
case 'content_id':
print $key; die(); // 0 ?????
$contents[] = $value;
break;
case 'page_id':
$pages[] = $value;
break;
}
return $value;
}, true);
您的代码看起来正常。问题是0==“content\u id”
是真的。PHP中的开关
使用松散(==
)比较。因为在术语中
有两个没有字符串键的值,它们会从0开始自动索引。
所以你得到的不是当你的函数找到
'content_id' => 6
但当它发现
/* 0 => */
[
'href' => null,
'icon' => 'lock',
'target' => '_blank'
],
编辑:
底线是-在这种情况下,如果进行严格比较,则必须使用(或在任何地方使用字符串键)。@rms谢谢;),我无法想象0==“content\u id”
是否为真。另外,在使用严格比较时,我没有修改switch语句,因此我认为有些地方出错。@GiorgiBotsvadze我知道,这很疯狂:)为了让它更好1=='content\u id'
是False:DD