相同的数组,但通过迭代或使用键对 foreach 输出不同

Same array but different output for foreach by iterating or using the key

提问人:Ralph van Nellestijn 提问时间:10/23/2023 最后编辑:Bret WeinraubRalph van Nellestijn 更新时间:10/24/2023 访问量:73

问:

我有一个数组(代表$detective),如下所示:

Array
(
    [detectiveid] => 52
    [name] => Waal - Noord
    [rise_value] => 2
    [rise_time] => 3
    [drop_value] => 2
    [drop_time] => 3
    [max_time] => 80
    [max_speed] => 30
    [max_range] => 1000
    [min_hits] => 2
    [virtuals] => Array
        (
            [103377] => Array
                (
                    [virtualid] => 103377
                    [latitude] => 51.8683
                    [longitude] => 5.88432
                    [template] => enose
                    [peaks] => Array
                        (
                            [1697893319] => Array
                                (
                                    [total] => 1.97
                                    [ignore] => 
                                    [datetime] => 2023-10-21 15:01:59
                                    [timestamp] => 1697893319
                                )

                        )

                )

            [103378] => Array
                (
                    [virtualid] => 103378
                    [latitude] => 51.8544
                    [longitude] => 5.86296
                    [template] => enose
                    [peaks] => Array
                        (
                        )

                )

            [103379] => Array
                (
                    [virtualid] => 103379
                    [latitude] => 51.8765
                    [longitude] => 5.81837
                    [template] => enose
                    [peaks] => Array
                        (
                            [1697895022] => Array
                                (
                                    [timestamp] => 1697895022
                                    [datetime] => 2023-10-21 15:30:22
                                    [total] => 1.83
                                    [ignore] => 1
                                )

                            [1697895083] => Array
                                (
                                    [timestamp] => 1697895083
                                    [datetime] => 2023-10-21 15:31:23
                                    [total] => 2.55
                                    [ignore] => 
                                )

                        )

                )

            [103380] => Array
                (
                    [virtualid] => 103380
                    [latitude] => 51.8825
                    [longitude] => 5.78394
                    [template] => enose
                    [peaks] => Array
                        (
                        )

                )

        )

)

但是在某个时候,我在使用 .然后我尝试使用并得到了预期的结果。foreach ($detective['virtuals'] as $virtual)foreach ($detective['virtuals'] as $key => $value)

使用 和 echo 给了我这个意想不到的结果:foreach ($detective['virtuals'] as $virtual)$virtual['virtualid']

103377
103378
103379
103379

使用 和 echo 给了我这个意想不到的结果:foreach ($detective['virtuals'] as $key => $value)$detective['virtuals'][$key]['virtualid']

103377
103378
103379
103380

有人对此有解释吗?当我用下面的方法替换上面的方法时,我得到的这些结果,如果我先运行上面的方法,然后运行下面的方法,下面的方法也会呼应上面的结果。看起来上面的方法不仅通过打印它而且通过操作它来破坏数组。

php 多维数组 foreach 键值

评论

0赞 Bret Weinraub 10/23/2023
预期结果是什么?
0赞 user2342558 10/23/2023
也许您在第二个循环中还有其他内容(带有键 => 值的 foreach)更改了数组内容,或者您正在打印在该循环中被覆盖的变量值
1赞 user2342558 10/23/2023
您应该发布 foreach 代码块以获得更多帮助
0赞 Pippo 10/24/2023
显然,在上面的方法中,您正在修改数组中的某些内容('=' 而不是 '==' 或类似的东西)

答:

0赞 ArtisticPhoenix 10/23/2023 #1

我能得出的唯一结论是,您的数组中的数据不正确。

在第一个示例中

 foreach ($detective['virtuals'] as $virtual)

您必须使用 .在第二种情况下,您使用的是数组的实际键,而不是存储在数据中的值。$virtual['virtualid']

如果你按照我的逻辑,一定是错的。$virtual['virtualid']

您可以通过输出两者来检查这一点

foreach ($detective['virtuals'] as $key => $virtual){
    echo "key: ".$key;
    echo  "\n";
    echo "virtualid: ".$virtual['virtualid'];
    echo  "------------------------\n";
 }

或者 ( 如果您不想使用$key => )

foreach ($detective['virtuals'] as $virtual){
    echo "key: ".key($detective['virtuals']);
    echo  "\n";
    echo "virtualid: ".$virtual['virtualid'];
    echo  "------------------------\n";
 }
 

这是唯一有意义的事情。当您进一步依赖密钥时,值得检查(在两个地方维护它)。如果在此代码之前出现问题,例如在构建数组时,将来可能会出现错误。

0赞 Ralph van Nellestijn 10/24/2023 #2

您的第一个选项返回:

foreach ($detective['virtuals'] as $key => $virtual){
    echo "key: ".$key;
    echo  ", ";
    echo "virtualid: ".$detective['virtuals'][$key]['virtualid'];
    echo  "<br />";
 }
key: 103377, virtualid: 103377
key: 103378, virtualid: 103378
key: 103379, virtualid: 103379
key: 103380, virtualid: 103379

秒选项返回:

foreach ($detective['virtuals'] as $virtual){
    echo "key: ".key($detective['virtuals']);
    echo  ", ";
    echo "virtualid: ".$virtual['virtualid'];
    echo  "<br />";
}
key: 103377, virtualid: 103377
key: 103377, virtualid: 103378
key: 103377, virtualid: 103379
key: 103377, virtualid: 103379

如果你把我最初发布的print_r结果算作第三个选项,那会得到预期的结果:

print_r($detective);
key: 103377, virtualid: 103377
key: 103378, virtualid: 103378
key: 103379, virtualid: 103379
key: 103380, virtualid: 103380

我同意你的结论,即数组中的数据是不正确的,但是,当从同一个数组获得这三个不收敛的输出时,这可能是我的错吗?我过去一直在对 ANSI C 进行编程,这对我来说看起来像是一个内存问题,但我希望找到解决我所犯错误的方法。

我现在能想到的唯一原因是通过不使用关联数组来解决它,从而摆脱键并仅使用 virtualid 作为标识符。我已经在做,但我得到了两次103379,而不是像print_r显示的那样103379然后是 103380。