Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 递归遍历数组会导致回调函数中的结果无效_Php_Recursion_Switch Statement_Comparison - Fatal编程技术网

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