2012-12-02 37 views
6

看看这个:PHP键()或获得foreach循环的下一个关键

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

OUTPUT:

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个包装托架。 所以这是巧合!

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

+3

有趣。如果你打开错误报告,你会看到很多错误。额外的括号打破了直接变量引用。 '$ a'是一个变量,'($ a)'是得到'$ a'的*值*的表达式。 'key'需要一个通过引用传递的变量。不知道究竟是什么'键'做了什么,为什么它的行为方式,但我想这是错误的,未定义的行为。 – deceze

+1

哇,如果这是打算行为真棒。曾经有很多次我可以用这样的东西。 –

+0

但你有什么建议?我应该这样保持吗? –

回答

4

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

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

行为来自foreach。当foreach遍历数组时,不同版本的PHP在设置数组内部current指针时会有不同的表现,这些指针是key(),next(),current()等被调用时正在查看的指针。

PHP中的数组并不像大多数语言中的数组;他们确实是对象(特别是关联数组)。认为它们有点像链接列表(它们是而不是链接列表,但只是出于说明的目的与我一起) - 当你迭代时,你需要知道你现在在哪里以及你将要在哪里下一个。

什么似乎是在这里发生的是,在任何版本的PHP您正在运行,foreach为循环开始设置内部current指针next元素在的,在设置$key$value变量后,立即你的代码。

我肯定会不是取决于此行为,因为随后的PHP更新可能会中断此代码。这只是这个特定版本的一个有趣的巧合。如果你想下一个键,看看替换你的foreach循环。关于next()的PHP手册有很好的例子,并且一定要检查出prev(),each()和其他函数,在“另见”部分。

+0

+100,绝对是个不错的答案。 –

相关问题