PHP数组在foreach()中获取下一个键/值[重复]

Posted

技术标签:

【中文标题】PHP数组在foreach()中获取下一个键/值[重复]【英文标题】:PHP array get next key/value in foreach() [duplicate] 【发布时间】:2013-12-27 02:13:39 【问题描述】:

我正在寻找一种在 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
    


【问题讨论】:

这是一个可行的解决方案:***.com/a/5096852/1022697 我会为此创建一个自定义迭代器。 【参考方案1】:

您不能以这种方式访问​​ next 和 next-next 值。

但是你可以做类似的事情:

$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
    

【讨论】:

尽管它没有 100% 回答我的问题,但我最终还是使用了它【参考方案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();

如果您打算在$next_val$next_next_val 上进行中继,请记住测试valid()

【讨论】:

【参考方案3】:

这是一种方法:

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

请注意,以这种方式编写的循环永远不会检查原始数组中的最后一个元素。这可以修复,尽管按照您当前的逻辑,这似乎并不重要,因为没有“更多”元素可以与最后一个元素进行比较。

【讨论】:

【参考方案4】:

查看 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]];

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

有趣的是,我已经为 PHP 编程了十年(有几年的停顿),但一周前我还需要一个一个的 walk 函数。

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

【讨论】:

以上是关于PHP数组在foreach()中获取下一个键/值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在php数组中搜索值并获取所有键

PHP遍历键值对数组

如何在没有 foreach 的情况下在 PHP 中使用键和值来内爆数组

php 取出数组 某一个键名和键值

php如何按数组键值排序?

PHP获取数组中重复值的键值