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

时间:2009-03-20 06:01:28

标签: php foreach

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

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

在PHP中,他们使用非整数索引来访问数组。因此,您必须使用foreach循环遍历数组。当你需要做出一些决定时(在我的情况下,在构建查询时附加或/和参数),这就成了问题。

我确信必须有一些标准的方法来做到这一点。

你如何在PHP中解决这个问题?

34 个答案:

答案 0 :(得分:277)

听起来你想要这样的东西:

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

话虽如此,你还没有 - 在php中使用foreach迭代一个“数组”。

答案 1 :(得分:187)

您可以使用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
    }
}

答案 2 :(得分:38)

为什么这么复杂?

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

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

答案 3 :(得分:22)

当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";

回答你的原始问题“在我的情况下,在构建查询时附加或/和参数”;这将遍历所有值,然后将它们连接在一起,在它们之间加上“和”,但不是在第一个值之前或在最后一个值之后:

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

答案 4 :(得分:20)

已经有很多答案,但是也值得研究迭代器,特别是因为它被要求采用标准方式:

$arr = range(1, 3);

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

您可能会发现某些内容对其他案例也更加灵活。

答案 5 :(得分:10)

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

foreach ($some_array as $element) {
    if(!next($some_array)) {
         // This is the last $element
    }
}

答案 6 :(得分:8)

因此,如果您的数组具有唯一的数组值,那么确定上一次迭代是微不足道的:

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!';
}

还要注意严格的coparision运算符,这在这种情况下非常重要。

答案 7 :(得分:5)

假设您将数组存储在变量中......

foreach($array as $key=>$value) 
{ 
    echo $value;
    if($key != count($array)-1) { echo ", "; }
}

答案 8 :(得分:4)

如果您需要为除第一个或最后一个元素之外的每个元素执行某些操作,并且仅当数组中有多个元素时,我更喜欢以下解决方案。

我知道上面有很多解决方案,并在我之前发布了几个月/一年,但我认为这本身就是相当优雅的。检查每个循环也是一个布尔检查,而不是数字“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;
}

例如,在网络开发术语中,如果您想在无序列表(ul)中为除了最后一个之外的每个元素添加 border-bottom,那么您可以添加除了第一个之外的每个元素的border-top(CSS:first-child,由IE7 +和Firefox / Webkit支持,支持这种逻辑,而IE7不支持last-child)。

您可以随意为每个嵌套循环重用$ 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)

答案 9 :(得分:4)

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

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

参考:Link

答案 10 :(得分:3)

您仍然可以将该方法与关联数组一起使用:

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

答案 11 :(得分:3)

因为你想找到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

答案 12 :(得分:3)

我强烈认为,在这个“XY问题”的根源上,OP只需要implode()功能。

答案 13 :(得分:2)

听起来你想要这样的东西:

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

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

答案 14 :(得分:1)

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

foreach($items as $idx => $item) {
    if (!isset($items[$idx+1])) {
        print "I am last";
    }
}

答案 15 :(得分:1)

如何使用“结束”? http://php.net/manual/en/function.end.php

答案 16 :(得分:1)

自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
    }
}

答案 17 :(得分:1)

foreach ($array as $key => $value) {

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

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

}

Reference

答案 18 :(得分:1)

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

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

答案 19 :(得分:1)

你可以做一个计数()。

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

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

end(arr);

仅返回最后一个元素。

并且,事实证明,您可以通过整数索引php数组。

非常满意
arr[1];

答案 20 :(得分:1)

您也可以这样做:

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

     // more code
}

答案 21 :(得分:0)

您可以通过以下方式直接获取最后一个索引:

$numItems = count($arr);

echo $arr[$numItems-1];

答案 22 :(得分:0)

如果我了解你,那么你只需要反转数组并通过pop命令获取最后一个元素:

   $rev_array = array_reverse($array);

   echo array_pop($rev_array);

答案 23 :(得分:0)

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

答案 24 :(得分:0)

我个人使用这种结构,可以方便地使用html&lt; ul&gt;和&lt; li>元素:只需更改其他属性的相等性......

数组不能包含false项,而是包含所有其他项,这些项都会转换为false boolean。

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

答案 25 :(得分:0)

这是你可以做到的另一种方式:

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

答案 26 :(得分:0)

这是我的解决方案: 只需得到数组的计数,减去1(因为它们从0开始)。

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

答案 27 :(得分:0)

另一种方法是记住上一个循环周期结果并将其用作最终结果:

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

答案 28 :(得分:0)

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

数组:

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

功能:

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

结果:

print $result;

lorem,ipsum,dolor,sit,amet

答案 29 :(得分:0)

尝试这个简单的解决方案

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

答案 30 :(得分:0)

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

下面是一个非整数索引的示例:

<?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);

Check here最后一个数组作为输出。

答案 31 :(得分:0)

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

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

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

答案 32 :(得分:0)

对于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:模型morg的100000次运行

时间:1869.3430423737毫秒

test2:如果最后一次运行100000次模型

时间:3235.6359958649毫秒

答案 33 :(得分:0)

您也可以尝试使用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;
?>