提问人:Ralph van Nellestijn 提问时间:10/23/2023 最后编辑:Bret WeinraubRalph van Nellestijn 更新时间:10/24/2023 访问量:73
相同的数组,但通过迭代或使用键对 foreach 输出不同
Same array but different output for foreach by iterating or using the key
问:
我有一个数组(代表$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
有人对此有解释吗?当我用下面的方法替换上面的方法时,我得到的这些结果,如果我先运行上面的方法,然后运行下面的方法,下面的方法也会呼应上面的结果。看起来上面的方法不仅通过打印它而且通过操作它来破坏数组。
答:
我能得出的唯一结论是,您的数组中的数据不正确。
在第一个示例中
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";
}
这是唯一有意义的事情。当您进一步依赖密钥时,值得检查(在两个地方维护它)。如果在此代码之前出现问题,例如在构建数组时,将来可能会出现错误。
您的第一个选项返回:
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。
评论