【问题标题】:php key() in foreach-loop strange behavior OR get the next key in foreach loopforeach 循环中的 php key() 奇怪行为或获取 foreach 循环中的下一个键
【发布时间】:2012-11-20 07:23:54
【问题描述】:

看看这个:

<?php
    $array = array('a' => '…', 'b' => '…', 'c' => '…', 'd' => '…', 'e' => '…', 'f' => '…');
    foreach ($array as $key => $val){
        echo "current key: $key, next key: ".key(($array))."<br>";
    }
?>

输出:

current key: a, next key: b
current key: b, next key: c
current key: c, next key: d
current key: d, next key: e
current key: e, next key: f
current key: f, next key: a

我正在寻找一个函数来获取 foreach 循环中关联数组的下一个键。我试了一下,突然它起作用了。 (如您在我的示例中所见)。

但是为什么这会起作用?是否有意义? ……对我来说不是! 你能给我解释一下吗?

这是因为 key(($array)) 部分,但为什么呢?我的意思是.. 这是一个错误.. 我想写 key($array) 但我忘了删除 2 个包装括号。 所以这是巧合!!!

为什么会这样?我的意思是,这很好,但是……????

【问题讨论】:

  • 有趣。如果您打开错误报告,您会看到很多错误。额外的括号破坏了直接变量引用。 $a 是一个变量,($a) 是导致$a 的表达式。 key 需要一个通过引用传递的变量。不知道 key 究竟做了什么,以及为什么它的行为方式如此,但我会将其归档为错误的、未定义的行为。
  • 哇,如果这是预期的行为真棒。有很多次我可以使用这样的东西。
  • 但是你有什么建议?我应该保持这种状态吗?
  • 绝对没有。 PHP 版本的行为甚至不一致,你不能依赖这个:3v4l.org/5RjfA
  • 好的。这是一个很好的。谢谢。

标签: php arrays behavior next


【解决方案1】:

根据key的PHP手册,key()返回当前数组位置的索引元素。

问题不在于key,甚至不在于双括号。 Key 通过引用接收数组,所以双括号没有多大作用。

该行为来自foreach。当foreach 遍历数组时,不同版本的PHP 在设置数组内部current 指针时会表现不同,这就是key()next()current() 等在调用它们时所查看的内容.

PHP 中的数组与大多数语言中的数组不同;它们实际上是对象(尤其是关联数组)。把它们想象成链表(它们不是链表,只是为了说明的目的和我一起去)——当你迭代时,你需要知道你当前在哪里以及你要去哪里成为下一个。

这里显然发生的是,在您运行的任何版本的 PHP 上,foreach 将内部 current 指针设置为在 for 循环的开头处的 next 元素, 在您的代码中设置 $key$value 变量之后立即。

我肯定会依赖这种行为,因为后续对 PHP 的更新可能会破坏此代码。这只是这个特定版本的一个有趣的巧合。如果您想要 next 键,请查看替换您的 foreach 循环。 next() 上的 PHP 手册有很好的示例,请务必同时查看 prev()each() 以及“另请参阅”部分中的其他函数。

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多