这个问题在这里已有答案:
- 获取foreach循环中的下一个元素 9个答案
1358
2017-12-09 20:02
起源
这是一个可能有效的解决方案: stackoverflow.com/a/5096852/1022697 - qwertynl
我会为此创建一个自定义迭代器。 - Peter Kiss
答案:
您不能以下一个和下一个 - 下一个值的方式访问。
但你可以做类似的事情:
$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL');
$keys = array_keys($a);
foreach(array_keys($keys) AS $k ){
$this_value = $a[$keys[$k]];
$nextval = $a[$keys[$k+1]];
$nextnextval = $a[$keys[$k+2]];
if($nextval == $this_value && $nextnextval == $this_value){
//staying put for next two legs
}
}
9
2017-12-09 20:06
我最终使用了这个,即使它没有回答我的问题100% - danielb
我找到了复杂的解决方案 O(n)
并且不需要通过数组前后搜索:
$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL');
// initiate the iterator for "next_val":
$nextIterator = new ArrayIterator($a);
$nextIterator->rewind();
$nextIterator->next(); // put the initial pointer to 2nd position
// initiaite another iterator for "next_next_val":
$nextNextIterator = new ArrayIterator($a);
$nextNextIterator->rewind();
$nextNextIterator->next();
$nextNextIterator->next(); // put the initial pointer to 3rd position
foreach($a AS $k => $v){
$next_val = $nextIterator->current();
$next_next_val = $nextNextIterator->current();
echo "Current: $v; next: $next_val; next_next: $next_next_val" . PHP_EOL;
$nextIterator->next();
$nextNextIterator->next();
}
只记得测试 valid()
如果你计划转发 $next_val
和 $next_next_val
。
2
2017-12-09 20:35
这是一种方法:
while($current = current($a)) {
$next = next($a);
$nextnext = next($a);
// Comparison logic here
prev($a); // Because we moved the pointer ahead twice, lets back it up once
}
请注意,以这种方式编写的循环永远不会检查原始数组中的最后一个元素。这可以修复,虽然你现在的逻辑似乎并不重要,因为没有“更多”元素可以比较最后一个。
1
2017-12-09 20:12
看看CachingIterator,如下面的答案所述:
或者使用array_keys()是针对同一问题发布的另一个答案,例如
$keys = array_keys($array);
for ($i = 0; $i < count($keys); $i++) {
$cur = $array[$keys[$i]];
$next = $array[$keys[$i+1]];
}
0
2017-12-09 20:11
你不能简单地“保持”循环。我怀疑你想要做一些比编写自定义迭代器更容易的事情。如果您只想忽略具有重复键的条目,则跟踪最后一个键并将其与当前键进行比较。
$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL');
// Prints LA NY FL
$last_v = null;
foreach ( $a as $k => $v ){
if ( $last_v == $v ) {
/**
* Duplicate value, so skip it
*/
continue;
}
echo $v.' ';
$last_v = $v;
}
0
2017-12-09 20:56
有趣的是,我正在编程PHP十年(暂停几年),但一周前我需要一个一个一个一个的步行功能。
这个给你: 下一个,prev,reset等。请参阅“另请参阅”部分。另外,检查 array_keys()
-2
2017-12-09 20:09