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