PHP的foreach没有显示数组中的第一个值

我有一个数组($ vEvents),如下所示:

Array
(
[0] => Array
    (
        [id] => 1174
        [date] => 120411
        [name] => DR. J 'Souled Out' ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )

[1] => Array
    (
        [id] => 1108
        [date] => 120410
        [name] => Verb presents Open Stage ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )

[2] => Array
    (
        [id] => 1104
        [date] => 120409
        [name] => DR. J 'Souled Out' ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )
[currLimit] => 10
[eventsRemaining] => 4

我将它回显到屏幕上:

reset ($vEvents);
foreach ($vEvents as $key => &$value) {
    if ($key != 'currLimit' && $key != 'eventsRemaining'){ //Makes sure it doesn't print out the limiter value
    $m = substr($value['date'],0,2);
    $d = substr($value['date'],2,2);
    $y = '20'.substr($value['date'],4,2);
    echo date("D", mktime(0, 0, 0, $m, $d, $y)).", ".date("M", mktime(0, 0, 0, $m, $d, $y))." ".$d.", ".$y." - ".$value['name'].'
'; } }

但在我的输出,而不是获得所有显示数组条目,它不断跳过第一个...输出:

Sat, Dec 04, 2010 - Verb presents Open Stage ~ 9pm (No Cover)
Fri, Dec 04, 2009 - DR. J 'Souled Out' ~ 9pm (No Cover)

但是,我的预期产出应该是:

Sun, Dec 04, 2011 - DR. J 'Souled Out' ~ 9pm (No Cover)
Sat, Dec 04, 2010 - Verb presents Open Stage ~ 9pm (No Cover)
Fri, Dec 04, 2009 - DR. J 'Souled Out' ~ 9pm (No Cover)

我已经尝试更改 name 键中的值,但其他所有整个显示都很好,它总是跳过第一个键。我以前从未遇到过这个问题。思考?

When I comment out the:if ($key != 'currLimit' && $key != 'eventsRemaining'){ //Makes sure it doesn't print out the limiter value line, it works fine. Is it relevant that the key of the first element is zero? But why would that fail my if check?

1
额外 编辑
意见: 1
不是说这肯定是问题,但是你会介意分享为什么用&符号为循环变量添加前缀吗?
额外 作者 Brian Warshaw,
你的数字键实际上是数字还是字符串?
额外 作者 Brian Warshaw,
你的代码看起来没问题。你的print_r()和你的循环之间有什么发生?顺便说一句,您可以省去 reset -all,因为它应该没有任何影响。
额外 作者 yankee,
@yankee我添加了 reset 来尝试和调试问题。通常我不会添加它。
额外 作者 MaurerPower,
@chris有一条线我在那里使用,但我不明白它会如何影响它...请参阅更新问题
额外 作者 MaurerPower,
您发布的代码和数组内容不能正确表示您实际执行的代码和数组内容。运行你在一个全新的完全独立的脚本中发布的代码和数组,你会看到它的工作原理。
额外 作者 goat,
尝试调试for循环内的值
额外 作者 Moyed Ansari,

2 答案

因为这是一个数组,我会尝试使用不同类型的循环,它应该会给你预期的结果:

<?php

$length = count( $vEvents );

for( $i = 0; $i < $length; i ++ )
{

$key = $i;
$value = $vEvents[ $i ];

//rest of the loop code here

}
?>
3
额外
@SteveBinder:这是不正确的,因为你可以像这样使用关联数组的foreach: foreach($ array as $ key => $ value)
额外 作者 xbonez,
foreach不是专门针对数组的,而是非常适合数组的抽象。使用foreach是完美的,因为我认为它是代码可读性的补充。
额外 作者 yankee,
我的理解是foreach循环专门用于迭代数组,从第一个元素开始,到最后一个结束
额外 作者 MaurerPower,
问题是在排除此问题后,我需要在循环中稍后访问两个密钥。他们是联想的。因此,我为什么试图使用一个foreach。
额外 作者 MaurerPower,
当你不知道对象的键/索引时,foreach是最好的,而for循环对索引数组更好。
额外 作者 Steve Binder,
然而这里的问题是为什么foreach跳过了“0”索引,这就是为什么我建议使用for循环。
额外 作者 Steve Binder,

当PHP处理值为0时,PHP很奇怪......在大多数情况下,它将它们视为false。所以,

if ($key != 'currLimit' && $key != 'eventsRemaining')

将在$ key == 0时计算为false。我会将其更改为:

if ($key !== 'currLimit' && $key !== 'eventsRemaining')
2
额外
完善!!!虽然我知道0在PHP中等于false,但我不知道这种语法会生效。使用严格的比较工作很好,谢谢!
额外 作者 MaurerPower,
再次感谢!这就是我喜欢SO的原因。像你这样的用户不仅能提供出色的答案,而且能够清楚地解释为什么。这就是我们都学习的方式:)
额外 作者 MaurerPower,
做了一点挖掘,发现因为$ key是一个整数值,所以PHP将'currLimit'转换为一个整数......它的计算结果为0.所以0!= 0是错误的。
额外 作者 bobwienholt,