使用foreach预览下一个数组元素

时间:2016-01-16 14:50:12

标签: php arrays foreach

我有一个foreach,它在数组中的项之间进行迭代以构建excel文件。 如果数组中的下一个元素与特定条件匹配(在一个键中具有特定值),我想在数组中的每个项后面放置一个总行。 所以我想使用%programfiles\WindowsApps来检查该值,但就我所知和我阅读here时使用的内容我将把指针移到下一行,答案是使用当前。如何在不移动指针的情况下查看数组中的下一个项目?读这个问题我写了这个:

next()

但这不起作用。如何解决?

编辑:根据答案,我会移动回声' Total'在下一次迭代开始时而不是在当前迭代的底部。就我在答案中看到的而言,没有其他解决方案使用foreach

4 个答案:

答案 0 :(得分:2)

要求是:

  • foreach循环内部查看next值或键但不更改current循环的foreach迭代器指针的位置。

虽然它是更多的代码,但它是在同一个数组上创建一个完全独立的迭代器的一种方法。

这个新的iterator必须与foreach循环保持同步,但这很简单。

优点是您可以使用next()prev()current()等操作任何您想要的方式,并且知道foreach循环不会受到影响。< / p>

对于此示例,其中要求是测试当前条目之前的下一个条目。值得一提的是从指向第二个条目的迭代器开始,每次只是前进。

示例,未经测试的代码......

$iter = new \ArrayIterator($cred)s; // mirror of the `foreach` loop 

迭代     foreach($ creds as $ cred){

    // get next key and value...
    $iter->next(); 
    $nextKey = $iter->key();
    $nextValue = $iter->current();

    echo $cred['tipo'];

    // if the next item has a 'tipo' key with a specific value
    if($nextValue['tipo']) != '4'){
        echo 'Total';
    }
}

答案 1 :(得分:1)

试试此代码

$keys = array_keys($creds);

for($i = 0; $i < sizeof($keys); $i++)
{
    echo $creds[$keys[$i]] .' ';

    //$creds[$keys[$i+1]] - next item

    if($keys[$i+1] == 'tipo' && $creds[$keys[$i+1]] == 4 )
    {
        //
    }
}

答案 2 :(得分:0)

如果当前项目具有您的特殊键/值对,那么我会检查每个循环,然后再结束一次。这样您就不必访问下一个项目(并向前和向后移动指针)。如果它比echo 'Total';更复杂,那么您可以将其包装到函数中,以避免在foreach循环之后和之后的代码重复。

$creds = [
    ['tipo' => '1'],
    ['tipo' => '2'],
    ['tipo' => '3'],
    ['tipo' => '4'],
    ['tipo' => '5'],
];

foreach ($creds as $cred) {
    if ($cred['tipo'] == '4') {
        echo "Total\n";
    }
    echo $cred['tipo'] . "\n";
}
// If the very last row had the special key, print the sum one more time
if ($cred['tipo'] == '4') {
    echo "Total\n";
}


/* Output:
1
2
3
Total
4
5
*/

编辑:

我误解了你的要求(&#34;我想在数组中的每个项目之后放置一个总行如果数组中的下一个元素符合特定条件&#34;)。如果你想要反过来,我建议,以及#34;缓冲&#34;变量$previous_row中当前行的值,直到foreach循环向前移动指针并且您能够访问并检查值:

$creds = [
    ['tipo' => '1'],
    ['tipo' => '2'],
    ['tipo' => '3'],
    ['tipo' => '4'],
    ['tipo' => '5'],
];

$previous_row = '';
foreach ($creds as $cred) {
    echo $previous_row;
    if ($previous_row && $cred['tipo'] != '4') {
        echo "Total\n";
    }
    $previous_row = $cred['tipo'] . "\n";
}
// If the very last row had the special key, print the sum one more time
echo $previous_row;
if ($cred['tipo'] != '4') {
    echo "Total\n";
}


/* Output:
1
Total
2
Total
3
4
Total
5
Total
*/

答案 3 :(得分:0)

使用next后可以尝试使用prev功能。它可能不是最好的解决方案,但应该有效。

$values = array(1,2,3);

foreach ($values as $a) {
    print next($values);
    prev();
}

应输出2,3

修改

实际上next()在执行后不会影响你的循环键,并为你提供正确的下一个值。在回答您提供的link 时也会注意到这一点。您还可以使用自定义迭代器和prev函数手动更改迭代。 http://php.net/manual/en/language.oop5.iterations.php

<?php
class MyIterator implements Iterator
{
    private $var = array();

    public function __construct($array)
    {
       if (is_array($array)) {
            $this->var = $array;
    }
}

public function rewind()
{
    reset($this->var);
}

public function current()
{
    $var = current($this->var);

    return $var;
}

public function key() 
{
    $var = key($this->var);
    return $var;
}

public function next() 
{
    $var = next($this->var);
    return $var;
}

public function prev()
{
    $var = prev($this->var);
    return $var;
}

public function valid()
{
    $key = key($this->var);
    $var = ($key !== NULL && $key !== FALSE);
    return $var;
}

}

$values = array(1,2,3);
$it = new MyIterator($values);

foreach ($it as $a => $b) {
   print 'next is '.$it->next();
   $it->prev();
}
?>