Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用foreach预览下一个数组元素_Php_Arrays_Foreach - Fatal编程技术网

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

Php 使用foreach预览下一个数组元素,php,arrays,foreach,Php,Arrays,Foreach,我有一个foreach,它在数组中的项之间迭代以构建一个excel文件。 如果数组中的下一个元素匹配特定条件(在一个键中有特定值),我想在数组中的每个项后面放置一个总计行。 因此,我想使用next()检查该值,但据我所知,对于使用next读取的内容,我将指针移动到下一行,答案是使用current。如何在不移动指针的情况下查看数组中的下一项?读到这个问题,我写了这样一段话: foreach($creds as $cred){ echo $cred['tipo']; //if the

我有一个foreach,它在数组中的项之间迭代以构建一个excel文件。 如果数组中的下一个元素匹配特定条件(在一个键中有特定值),我想在数组中的每个项后面放置一个总计行。 因此,我想使用
next()
检查该值,但据我所知,对于使用next读取的内容,我将指针移动到下一行,答案是使用current。如何在不移动指针的情况下查看数组中的下一项?读到这个问题,我写了这样一段话:

foreach($creds as $cred){
    echo $cred['tipo'];
    //if the next item has a 'tipo' key with a specific value
    if(current($creds['tipo'])!='4'){
        echo 'Total';
    }
}
但这是行不通的。如何修复它


编辑:根据答案,我将在下一次迭代开始时移动echo“Total”内容,而不是在当前迭代的底部。据我在答案中看到的,没有其他使用foreach的解决方案,我会在每个循环中检查当前项目是否有您的特殊键/值对,然后在最后再检查一次。这样,您就不必访问下一项(并前后移动指针)。如果比
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
*/
编辑: 我误解了您的要求(“如果数组中的下一个元素与特定条件匹配,我想在数组中的每个项目后面放置一个总计行”
)。如果您想反过来,我建议您在变量
$previous\u 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
*/
试试这个代码

$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 )
    {
        //
    }
}
$keys=array\u keys($creds);
对于($i=0;$i
在使用“下一步”之后,您可以尝试使用“上一步”功能。这可能不是最好的解决方案,但应该有效

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

foreach ($values as $a) {
    print next($values);
    prev();
}
应输出2,3

编辑

实际上,next()不会影响执行后的循环键,并为您提供正确的next值。在回答您提供的问题时也注意到了这一点。还可以使用自定义迭代器和prev函数手动更改迭代


要求是:

  • foreach
    循环内查看
    next
    值或键,但不更改
    foreach
    循环的
    current
    迭代器指针的位置
虽然这是更多的代码,但一种方法是在同一数组上创建一个完全独立的迭代器

这个新的
迭代器
必须与
foreach
循环保持同步,但这非常简单

优点是您可以使用
next()
prev()
current()
等任意方式进行操作,并且知道
foreach
循环不会受到影响

例如,要求在当前条目之前测试下一个条目。从迭代器指向第二个条目开始,每次都向前推进,这是值得的

例如,未测试的代码

$iter = new \ArrayIterator($cred)s; // mirror of the `foreach` loop 
迭代器 foreach($creds作为$cred){


不确定,但是
='4'
正在寻找一个字符串,而不是一个可能的整数
==4
。那么($x=0;$xforeach循环中,没有任何东西可以阻止您使用单独的数组迭代器,您可以在
foreach
循环中以任何方式使用该迭代器。在
foreach循环外,请执行:
$iter=new\ArrayIterator($cred)
。在循环内部,确保foreach循环和
$iter
停留在步骤i中,即循环结束时执行
next()
。其中有用的是可以执行
next()
prev()
在$iter上。foreach
将不知道或不关心。抱歉,此代码正在检查实际行,但我想在当前行后回显“Total”,如果下一行为4作为键“tipo”@LelioFaieta的值,我已进行了一个小编辑。正确的是,当前项检查值为4,但在常规li之前ne输出,也就是说,它发生在前一行之后。结果应该是1总计、2总计、3总计、4总计、5总计。它应该跳过3总计,因为下一项是4我现在在“编辑”中更改了它。使用
for
循环可能会更优雅一些,但我保留了
foreach
只是为了演示一个可能的解决方案。谢谢!这是一个有效的解决方法,但我希望了解如何在不移动foreach循环指针的情况下预览数组中的下一项。$next=$creds[next($keys)]此下一个值
$iter = new \ArrayIterator($cred)s; // mirror of the `foreach` loop 
    // 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';
    }
}