PHP数组获取foreach()中的下一个键/值

时间:2013-12-09 20:02:20

标签: php arrays loops foreach

我正在寻找一种方法来获取foreach()中的下一个和下一个+ 1键/值对。例如:

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL');

foreach($a AS $k => $v){

    if($nextval == $v && $nextnextval == $v){
       //staying put for next two legs
    }

}

6 个答案:

答案 0 :(得分:10)

您不能以下一个和下一个下一个值的方式访问。

但你可以做类似的事情:

$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
    }
}

答案 1 :(得分:2)

我找到了复杂度为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 :(得分:1)

这是一种方法:

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
}

示例:http://3v4l.org/IGCXW

请注意,以这种方式编写的循环永远不会检查原始数组中的最后一个元素。这可能是固定的,虽然你现在的逻辑似乎并不重要,因为没有“更多”元素来比较最后一个。

答案 3 :(得分:0)

看看CachingIterator,如下面的答案所述:

Peek ahead when iterating an array in PHP

或者使用array_keys()是针对同一个问题发布的另一个答案,例如

$keys = array_keys($array);
for ($i = 0; $i < count($keys); $i++) {
    $cur = $array[$keys[$i]];
    $next = $array[$keys[$i+1]];
}

答案 4 :(得分:0)

你不能简单地“保持”循环。我怀疑你正在寻找比编写自定义迭代器更容易的事情。如果您只想忽略具有重复键的条目,则跟踪最后一个键并将其与当前键进行比较。

$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;
}

答案 5 :(得分:-2)

有趣的是,我正在编程PHP十年(暂停几年),但一周前我需要一对一的步行功能。

在这里:next,prev,reset等。请参阅“另请参阅”部分。另外,请检查array_keys()