2013-12-09 43 views
11

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

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

} 
+0

这是可能的工作的解决方案:http://stackoverflow.com/a/5096852/1022697 – qwertynl

+0

我将创建一个自定义的迭代器。 –

回答

8

您不能以这种方式访问​​下一个值和下一个值。

但是你可以做同样的事情:

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

我结束了使用这个,即使它没有回答我的问题100% – danielb

-2

好笑的是,我有十年编程PHP(含年暂停),但我需要一个接一个走功能就在一周前。

您在这里:next,prev,重置等。请参见“另请参阅”部分。此外,检查array_keys()

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

需要注意的是这样写绝不会检查你的原始数组中的最后一个元素的循环。这可能是固定的,但用你目前的逻辑来看,它似乎并不重要,因为没有“最多”元素来比较最后一个元素。

1

我发现与复杂性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

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