在PHP中使用foreach循环时查找数组的最后一个元素

我正在使用一些参数编写SQL查询创建者。在Java中,只需通过数组长度检查当前数组位置,就可以很容易地从for循环中检测数组的最后一个元素。

for(int i=0; i< arr.length;i++){
boolean isLastElem = i== (arr.length -1) ? true : false;
}

在PHP中,它们有访问数组的非整数索引。因此必须使用foreach循环遍历数组。当您需要做出某些决定时(在我的例子中,在构建查询时附加或/和参数),这就会出现问题。

我相信一定有某种标准的方法来做这件事。

PHP中如何解决这个问题?

475343 次浏览

您可以执行count()。

for ($i=0;$i<count(arr);$i++){
$i == count(arr)-1 ? true : false;
}

或者如果你只寻找最后一个元素,你可以使用end()。

end(arr);

只返回最后一个元素。

而且,你可以用整数来索引php数组。它完全满意

arr[1];

听起来你想要的是这样的:

$numItems = count($arr);
$i = 0;
foreach($arr as $key=>$value) {
if(++$i === $numItems) {
echo "last index!";
}
}

也就是说,你不必在php中使用foreach迭代一个“数组”。

你可以使用end(array_keys($array))获取数组的最后一个键的值,并将其与当前键进行比较:

$last_key = end(array_keys($array));
foreach ($array as $key => $value) {
if ($key == $last_key) {
// last element
} else {
// not last element
}
}

你仍然可以对关联数组使用该方法:

$keys = array_keys($array);
for ($i = 0, $l = count($array); $i < $l; ++$i) {
$key = $array[$i];
$value = $array[$key];
$isLastItem = ($i == ($l - 1));
// do stuff
}


// or this way...


$i = 0;
$l = count($array);
foreach ($array as $key => $value) {
$isLastItem = ($i == ($l - 1));
// do stuff
++$i;
}

当toEnd达到0时,意味着它处于循环的最后一次迭代中。

$toEnd = count($arr);
foreach($arr as $key=>$value) {
if (0 === --$toEnd) {
echo "last index! $value";
}
}

最后一个值在循环之后仍然可用,所以如果你只是想在循环之后用它来做更多的事情,这样更好:

foreach($arr as $key=>$value) {
//something
}
echo "last index! $key => $value";

如果您不想将最后一个值作为特殊的内部循环。如果您有大型数组,这应该更快。(如果你在相同范围内的循环之后重用数组,你必须先“复制”数组)。

//If you use this in a large global code without namespaces or functions then you can copy the array like this:
//$array = $originalArrayName; //uncomment to copy an array you may use after this loop


//end($array); $lastKey = key($array); //uncomment if you use the keys
$lastValue = array_pop($array);


//do something special with the last value here before you process all the others?
echo "Last is $lastValue", "\n";


foreach ($array as $key => $value) {
//do something with all values before the last value
echo "All except last value: $value", "\n";
}


//do something special with the last value here after you process all the others?
echo "Last is $lastValue", "\n";

并回答您最初的问题“在我的情况下,在构建查询时附加或/和参数”;这将遍历所有值,然后将它们连接到一个字符串中,其中包含“and”,但不是在第一个值之前或最后一个值之后:

$params = [];
foreach ($array as $value) {
$params[] = doSomething($value);
}
$parameters = implode(" and ", $params);

你也可以这样做:

end( $elements );
$endKey = key($elements);
foreach ($elements as $key => $value)
{
if ($key == $endKey) // -- this is the last item
{
// do something
}


// more code
}

这里有另一种方法:

$arr = range(1, 10);


$end = end($arr);
reset($arr);


while( list($k, $v) = each($arr) )
{
if( $n == $end )
{
echo 'last!';
}
else
{
echo sprintf('%s ', $v);
}
}

请注意:这不起作用,因为调用next()会使数组指针向前移动,所以你会跳过循环中的所有其他元素


为什么这么复杂?

foreach($input as $key => $value) {
$ret .= "$value";
if (next($input)==true) $ret .= ",";
}

这将在除最后一个值之外的每个值后面添加a !

如果您需要对除第一个或最后一个元素之外的每个元素都做一些事情,并且仅当数组中有多个元素时,我更喜欢以下解决方案。

我知道在我之前的几个月或一年,上面有很多解决方案,但我觉得这个解决方案本身就相当优雅。每个循环的检查也是一个布尔检查,而不是一个数字“i=(count-1)”检查,这可能会允许更少的开销。

循环的结构可能让人感觉很尴尬,但你可以将它与HTML表标签中的thead(开始)、tfoot(结束)、tbody(当前)的顺序进行比较。

$first = true;
foreach($array as $key => $value) {
if ($first) {
$first = false;
// Do what you want to do before the first element
echo "List of key, value pairs:\n";
} else {
// Do what you want to do at the end of every element
// except the last, assuming the list has more than one element
echo "\n";
}
// Do what you want to do for the current element
echo $key . ' => ' . $value;
}

例如,在web开发术语中,如果你想在无序列表(ul)中添加除最后一个元素外的每个元素的边界底部,那么你可以改为添加除第一个元素外的每个元素的Border-top (CSS:first-child,由IE7+和Firefox/Webkit支持此逻辑,而:last-child不被IE7支持)。

您可以自由地为每个嵌套循环重用$first变量,并且事情会工作得很好,因为在第一次迭代的第一个过程中,每个循环都会使$first为false(因此中断/异常不会引起问题)。

$first = true;
foreach($array as $key => $subArray) {
if ($first) {
$string = "List of key => value array pairs:\n";
$first = false;
} else {
echo "\n";
}


$string .= $key . '=>(';
$first = true;
foreach($subArray as $key => $value) {
if ($first) {
$first = false;
} else {
$string .= ', ';
}
$string .= $key . '=>' . $value;
}
$string .= ')';
}
echo $string;

示例输出:

List of key => value array pairs:
key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2)
key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3)
key3=>(v3_key1=>v3_val1)

如果我明白你的意思,那么你所需要的就是反转数组,并通过pop命令获取最后一个元素:

   $rev_array = array_reverse($array);


echo array_pop($rev_array);

你也可以尝试这样让你的查询…这里显示的是INSERT

<?php
$week=array('one'=>'monday','two'=>'tuesday','three'=>'wednesday','four'=>'thursday','five'=>'friday','six'=>'saturday','seven'=>'sunday');
$keys = array_keys($week);
$string = "INSERT INTO my_table ('";
$string .= implode("','", $keys);
$string .= "') VALUES ('";
$string .= implode("','", $week);
$string .= "');";
echo $string;
?>

对于SQL查询生成脚本,或任何对第一个或最后一个元素执行不同操作的脚本,避免使用不必要的变量检查要快得多(几乎快两倍)。

目前公认的解决方案使用循环和循环内的检查,将使every_single_iteration,正确的(快速)方法如下:

$numItems = count($arr);
$i=0;
$firstitem=$arr[0];
$i++;
while($i<$numItems-1){
$some_item=$arr[$i];
$i++;
}
$last_item=$arr[$i];
$i++;

一个自制的基准测试显示如下:

Test1: 100000次模型morg

时间:1869.3430423737毫秒

Test2:模型运行100000次

时间:3235.6359958649毫秒

听起来你想要的是这样的:

$array = array(
'First',
'Second',
'Third',
'Last'
);


foreach($array as $key => $value)
{
if(end($array) === $value)
{
echo "last index!" . $value;
}
}

已经有很多答案了,但也有必要研究一下迭代器,特别是当它被要求使用标准方式时:

$arr = range(1, 3);


$it = new CachingIterator(new ArrayIterator($arr));
foreach($it as $key => $value)
{
if (!$it->hasNext()) echo 'Last:';
echo $value, "\n";
}

您可能也会发现一些在其他情况下更灵活的方法。

另一种方法是记住之前的循环结果,并将其作为最终结果:

    $result = $where = "";
foreach ($conditions as $col => $val) {
$result = $where .= $this->getAdapter()->quoteInto($col.' = ?', $val);
$where .=  " AND ";
}
return $this->delete($result);

我个人使用这种结构,可以很容易地使用html <Ul > <Li >元素:简单地改变其他属性的等式…

数组不能包含假项,只能包含转换为假布尔值的所有其他项。

$table = array( 'a' , 'b', 'c');
$it = reset($table);
while( $it !== false ) {
echo 'all loops';echo $it;
$nextIt = next($table);
if ($nextIt === false || $nextIt === $it) {
echo 'last loop or two identical items';
}
$it = $nextIt;
}

所以,如果你的数组有唯一的数组值,那么确定最后一次迭代是微不足道的:

foreach($array as $element) {
if ($element === end($array))
echo 'LAST ELEMENT!';
}

如您所见,如果最后一个元素在数组中只出现一次,则此方法有效,否则将得到假警报。如果不是,则必须比较键(肯定是唯一的)。

foreach($array as $key => $element) {
end($array);
if ($key === key($array))
echo 'LAST ELEMENT!';
}

还要注意严格共配运算符,这在本例中非常重要。

我有一种强烈的感觉,在这个“XY问题”的根源上,OP只想要implode()函数。

你可以直接得到最后一个索引:

$numItems = count($arr);

echo $arr[$numItems-1];

假设你把数组存储在一个变量中…

foreach($array as $key=>$value)
{
echo $value;
if($key != count($array)-1) { echo ", "; }
}
<?php foreach($have_comments as $key => $page_comment): ?>
<?php echo $page_comment;?>
<?php if($key+1<count($have_comments)): ?>
<?php echo ', '; ?>
<?php endif;?>
<?php endforeach;?>

因为你寻找EOF数组的意图只是为了粘合。请了解下面的策略。你不需要EOF:

$given_array = array('column1'=>'value1',
'column2'=>'value2',
'column3'=>'value3');


$glue = '';
foreach($given_array as $column_name=>$value){
$where .= " $glue $column_name = $value"; //appending the glue
$glue   = 'AND';
}
echo $where;

o / p:

column1 = value1 AND column2 = value2 AND column3 = value3

我有点喜欢下面的,因为我觉得它相当整洁。让我们假设我们正在创建一个字符串,所有元素之间都有分隔符:例如a,b,c

$first = true;
foreach ( $items as $item ) {
$str = ($first)?$first=false:", ".$item;
}

这应该是找到最后一个元素的简单方法:

foreach ( $array as $key => $a ) {
if ( end( array_keys( $array ) ) == $key ) {
echo "Last element";
} else {
echo "Just another element";
}
}

参考:链接

以下是我的解决方案: 简单地获取数组的计数,减去1(因为它们从0开始).

$lastkey = count($array) - 1;
foreach($array as $k=>$a){
if($k==$lastkey){
/*do something*/
}
}

一种方法是检测迭代器是否有next。如果迭代器没有附加next,则意味着你在最后一个循环中。

foreach ($some_array as $element) {
if(!next($some_array)) {
// This is the last $element
}
}
foreach ($array as $key => $value) {


$class = ( $key !== count( $array ) -1 ) ? " class='not-last'" : " class='last'";


echo "<div{$class}>";
echo "$value['the_title']";
echo "</div>";


}

< a href = " https://dev-notes。eu/2016/09/target-the-last-item-in-a-php-foreach-loop/" rel="nofollow noreferrer">Reference . php-foreach-loop/" rel="nofollow noreferrer

不要在最后一个值后面加逗号:

数组:

$data = ['lorem', 'ipsum', 'dolor', 'sit', 'amet'];

功能:

$result = "";
foreach($data as $value) {
$resut .= (next($data)) ? "$value, " : $value;
}

结果:

print $result;

Lorem, ipsum, dolor, sit, amet

试试这个简单的解决方案

$test = ['a' => 1, 'b' => 2, 'c' => 3];


$last_array_value = end($test);


foreach ($test as $key => $value) {
if ($value === $last_array_value) {
echo $value; // display the last value
} else {
echo $value; // display the values that are not last elements
}
}

end()函数是PHP中的内置函数,用于查找给定数组的最后一个元素。函数的作用是:将数组的内部指针更改为指向最后一个元素,并返回最后一个元素的值。

下面是一个非整型索引的例子:

<?php
$arr = array(
'first' =>
array('id' => 1, 'label' => 'one'),
'second' =>
array('id' => 2, 'label' => 'two'),
'last' =>
array('id' => 9, 'label' => 'nine')
);
$lastIndexArr = end($arr);
print_r($lastIndexArr);

检查在这里最后一个数组作为输出。

从foreach数组中获取第一个和最后一个元素

foreach($array as $value) {
if ($value === reset($array)) {
echo 'FIRST ELEMENT!';
}


if ($value === end($array)) {
echo 'LAST ITEM!';
}
}

从PHP 7.3开始:

你可以使用array_key_last($array)获取数组的最后一个键的值,并将其与当前键进行比较:

$last_key = array_key_last($array);
foreach ($array as $key => $value) {
if ($key == $last_key) {
// last element
} else {
// not last element
}
}

如果它是一个一维数组,你可以这样做,以保持它的简短和甜蜜:

foreach($items as $idx => $item) {
if (!isset($items[$idx+1])) {
print "I am last";
}
}
$array  = array("dog", "rabbit", "horse", "rat", "cat");
foreach($array as $index => $animal) {
if ($index === array_key_first($array))
echo $animal; // output: dog


if ($index === array_key_last($array))
echo $animal; // output: cat
}