递归遍历数组会在回调函数中导致无效结果

时间:2018-12-20 21:33:04

标签: php recursion switch-statement comparison

我试图递归遍历数组的每个元素,以获得键等于page_idcontent_id的值。

问题在于,在回调函数中,在switch语句中,我完全是奇怪的行为,大小写匹配但值不同。

这让我发疯了一段时间。我什至尝试使用严格的比较,例如if($key === 'component_id') print $key; die();。我期望得到'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);

我希望输出为component_id,但是我得到了0

我也知道我可以使用array_walkarray_walk_recursive,但是我更喜欢这种方法,因为我认为它更优雅,更易读。

1 个答案:

答案 0 :(得分:0)

您的代码看起来还不错。问题是0 == 'content_id' True 。 PHP中的switch使用的是宽松(==)比较。而且由于在terms中有两个没有字符串键的值,所以它们会自动从0开始索引。 因此,获得的不是功能找到时

'content_id' => 6

但是找到了

/* 0 => */
[
   'href' => null,
   'icon' => 'lock',
   'target' => '_blank'
],

编辑: 底线是-在这种情况下,您必须使用if进行严格的比较===(或在各处使用字符串键)。