Checking during array iteration, if the current element is the last element

后端 未结 8 2012
迷失自我
迷失自我 2020-12-13 03:41

Please help me to translate this pseudo-code to real php code:

 foreach ($arr as $k => $v)
    if ( THIS IS NOT THE LAST ELEMENT IN THE ARRAY)
        doS         


        
相关标签:
8条回答
  • 2020-12-13 03:50

    you can use PHP's end()

    $array = array('a' => 1,'b' => 2,'c' => 3);
    $lastElement = end($array);
    foreach($array as $k => $v) {
        echo $v . '<br/>';
        if($v == $lastElement) {
             // 'you can do something here as this condition states it just entered last element of an array'; 
        }
    }
    

    Update1

    as pointed out by @Mijoja the above could will have problem if you have same value multiple times in array. below is the fix for it.

    $array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2);
    //point to end of the array
    end($array);
    //fetch key of the last element of the array.
    $lastElementKey = key($array);
    //iterate the array
    foreach($array as $k => $v) {
        if($k == $lastElementKey) {
            //during array iteration this condition states the last element.
        }
    }
    

    Update2

    I found solution by @onteria_ to be better then what i have answered since it does not modify arrays internal pointer, i am updating the answer to match his answer.

    $array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2);
    // Get array keys
    $arrayKeys = array_keys($array);
    // Fetch last array key
    $lastArrayKey = array_pop($arrayKeys);
    //iterate array
    foreach($array as $k => $v) {
        if($k == $lastArrayKey) {
            //during array iteration this condition states the last element.
        }
    }
    

    Thank you @onteria_

    Update3

    As pointed by @CGundlach PHP 7.3 introduced array_key_last which seems much better option if you are using PHP >= 7.3

    $array = array('a' => 1,'b' => 2,'c' => 3);
    $lastKey = array_key_last($array);
    foreach($array as $k => $v) {
        echo $v . '<br/>';
        if($k == $lastKey) {
             // 'you can do something here as this condition states it just entered last element of an array'; 
        }
    }
    
    0 讨论(0)
  • 2020-12-13 03:56

    This always does the trick for me

    foreach($array as $key => $value) {
       if (end(array_keys($array)) == $key)
           // Last key reached
    }
    

    Edit 30/04/15

    $last_key = end(array_keys($array));
    reset($array);
    
    foreach($array as $key => $value) {
      if ( $key == $last_key)
          // Last key reached
    }
    

    To avoid the E_STRICT warning mentioned by @Warren Sergent

    $array_keys = array_keys($array);
    $last_key = end($array_keys);
    
    0 讨论(0)
  • 2020-12-13 03:56
    $myarray = array(
      'test1' => 'foo',
      'test2' => 'bar',
      'test3' => 'baz',
      'test4' => 'waldo'
    );
    
    $myarray2 = array(
    'foo',
    'bar',
    'baz',
    'waldo'
    );
    
    // Get the last array_key
    $last = array_pop(array_keys($myarray));
    foreach($myarray as $key => $value) {
      if($key != $last) {
        echo "$key -> $value\n";
      }
    }
    
    // Get the last array_key
    $last = array_pop(array_keys($myarray2));
    foreach($myarray2 as $key => $value) {
      if($key != $last) {
        echo "$key -> $value\n";
      }
    }
    

    Since array_pop works on the temporary array created by array_keys it doesn't modify the original array at all.

    $ php test.php
    test1 -> foo
    test2 -> bar
    test3 -> baz
    0 -> foo
    1 -> bar
    2 -> baz
    
    0 讨论(0)
  • 2020-12-13 03:57

    Why not this very simple method:

    $i = 0; //a counter to track which element we are at
    foreach($array as $index => $value) {
        $i++;
        if( $i == sizeof($array) ){
            //we are at the last element of the array
        }
    }
    
    0 讨论(0)
  • 2020-12-13 04:02

    My solution, also quite simple..

    $array = [...];
    $last = count($array) - 1;
    
    foreach($array as $index => $value) 
    {
         if($index == $last)
            // this is last array
         else
            // this is not last array
    }
    
    0 讨论(0)
  • 2020-12-13 04:08

    I know this is old, and using SPL iterator maybe just an overkill, but anyway, another solution here:

    $ary = array(1, 2, 3, 4, 'last');
    $ary = new ArrayIterator($ary);
    $ary = new CachingIterator($ary);
    foreach ($ary as $each) {
        if (!$ary->hasNext()) { // we chain ArrayIterator and CachingIterator
                                // just to use this `hasNext()` method to see
                                // if this is the last element
           echo $each;
        }
    }
    
    0 讨论(0)
提交回复
热议问题