2015-03-07 04:05
采纳率: 100%
浏览 42


I have created a php class that implements the Iterator interface. I am successfully able to iterate through the class like this:

foreach($data as $key=>$value)
    echo $key;

This, however, consistently gives me a strange result:

foreach($data as $item)
    echo key($item)

The first style calls the key() method in my class for every element. The latter never calls it.

Am I missing something? That should work, shouldn't it?

Update: I think I am missing something. The key function doesn't work as I would expect it to for a simple array, either:

$test = [['name'=>'foo'],['name'=>'bar'],['name'=>'fizz']];

foreach($test as $key=>$item)
    echo $key;

foreach ($test as $item)
    echo key($item);

gives me 012namenamename... not quite what I was expecting. I think I need to just use the $key=>value notation, and never count on key() in a loop.

图片转代码服务由CSDN问答提供 功能建议

我创建了一个实现Iterator接口的php类。 我成功地能够像这样迭代这个类:

  foreach($ data as $ key => $ value)
 echo $ key; 


  foreach($ data as $ item)
 echo key(  $ item)

第一个样式在我的类中为每个元素调用key()方法。 后者从不称呼它。

我错过了什么吗? 这应该有用,不应该吗?

更新:我想我错过了什么。 对于一个简单的数组,关键函数不能正常工作:

  $ test = [['name'=>'foo'],  ['name'=>'bar'],['name'=>'fizz']]; 
foreach($ test as $ key => $ item)
 echo $ key; 
 \  nforeach($ test as $ item)
 echo key($ item); 

给我012namenamename ...不是我所期待的。 我想我只需要使用$ key =>值表示法,并且永远不要依赖于循环中的key()。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dongzhuange2625 2015-03-07 04:12

    Your first version is correct, which is why it works. For a short explanation of why your second method doesn't work, see this comment in the manual.

    This is because (from the manual for foreach() )

    On each iteration, the value of the current element is assigned to $value and the internal array pointer is advanced by one

    So your second method is fetching the next key, not the current one.

    打赏 评论

相关推荐 更多相似问题