programing

PHP에서 foreach 루프를 사용하는 동안 배열의 마지막 요소 찾기

goodsources 2022. 10. 1. 15:41
반응형

PHP에서 foreach 루프를 사용하는 동안 배열의 마지막 요소 찾기

몇 가지 파라미터를 사용하여 SQL 쿼리 작성자를 작성하고 있습니다.Java에서는 어레이의 현재 위치를 어레이 길이로 확인하는 것만으로 for 루프 내부에서 어레이의 마지막 요소를 쉽게 검출할 수 있습니다.

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

PHP에서는 어레이에 액세스하기 위한 비정수 인덱스가 있습니다.따라서 포어치 루프를 사용하여 어레이 상에서 반복해야 합니다.이는 사용자가 어떤 결정을 내려야 할 때 문제가 됩니다(이 경우 쿼리를 빌드하는 동안 추가 또는 매개 변수를 추가해야 합니다).

나는 이것을 하기 위한 어떤 표준적인 방법이 있을 것이라고 확신한다.

PHP에서 이 문제를 해결하려면 어떻게 해결합니까?

다음과 같은 것을 원하는 것처럼 들립니다.

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

해서 '배열하다 '하다', '배열하다', '배열하다'를 반복할 foreachmanager로 지정합니다.

은 배열의 마지막 키를 사용하여 수 .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
    }
}

주의: next()를 호출하면 어레이 포인터가 진행되기 때문에 루프 내의 다른 모든 요소를 건너뜁니다.


왜 그렇게 복잡해?

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

그러면 마지막 값을 제외한 모든 값 뒤에 가 추가됩니다.

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

이미 많은 해답이 있지만, 특히 표준적인 방법을 요구받았기 때문에 반복자를 검토할 필요가 있습니다.

$arr = range(1, 3);

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

다른 경우에서도 더 유연하게 작동하는 제품을 찾을 수 있습니다.

에 '반복'이 있는지 입니다.next. 루프에 반복기에 다음 연결이 없는 경우 마지막 루프에 있음을 의미합니다.

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

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 배열에서 처음과 마지막 요소를 가져오다

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

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

따라서 어레이에 고유한 어레이 값이 있는 경우 마지막 반복을 결정하는 것은 간단합니다.

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

또한 이 경우 매우 중요한 엄밀한 공동 연산자에 주목하십시오.

관련 배열에서는 이 방법을 계속 사용할 수 있습니다.

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

배열이 변수에 저장되어 있다고 가정하면...

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

마지막 값 뒤에 쉼표 추가 안 함:

어레이:

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

기능:

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

그 결과:

print $result;

lorem, ipsum, dolor, sit, amet

첫 번째 또는 마지막 요소를 제외한 모든 요소에 대해 작업을 수행해야 하는 경우 및 배열에 여러 요소가 있는 경우에만 다음 솔루션을 사용하는 것이 좋습니다.

위에 많은 솔루션이 있고, 제 솔루션보다 몇 달 또는 1년 전에 게시되었다는 것을 알지만, 이 솔루션 자체는 상당히 우아하다고 생각합니다.검사 간격 루프는 숫자 "i=(count-1)" 검사와는 반대로 부울 검사이므로 오버헤드가 줄어들 수 있습니다.

루프의 구조는 어색할 수 있지만 HTML 테이블 태그의 tad(시작), 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)를 제외한 모든 요소에 보더 보텀을 추가하는 경우 대신 첫 번째 요소를 제외한 모든 요소에 보더 보텀을 추가할 수 있습니다(CSS:first-child는 이 로직을 지원하지만 Firefox/Webkit은 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)

이것은 마지막 요소를 쉽게 찾을 수 있는 방법입니다.

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

레퍼런스 : 링크

문제가 'XY'만을 .implode()기능.

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;

op:

column1 = value1 AND column2 = value2 AND column3 = value3

"end"를 사용하는 것은 어떻습니까?http://php.net/manual/en/function.end.php

다음과 같은 것을 원하는 것처럼 들립니다.

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

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

카운트를 할 수 있습니다.

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

또는 마지막 요소만 찾는 경우 end()를 사용할 수 있습니다.

end(arr);

마지막 요소만 반환합니다.

php 어레이를 정수로 인덱싱할 수 있습니다.와 함께라면 더할 나위 없이 행복하다

arr[1];

다음과 같은 작업을 수행할 수도 있습니다.

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

     // more code
}

저는 다음과 같은 것이 꽤 깔끔하다고 느끼기 때문에 좋아합니다.모든 요소 사이에 구분자가 있는 문자열을 작성한다고 가정합니다.예를 들어 a, b, c

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

제 해결책은 다음과 같습니다.어레이의 카운트를 마이너스 1로 하면 됩니다(0부터 시작).

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

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

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

}

언급

단차원 배열인 경우 다음과 같이 하면 짧고 단조로움을 유지할 수 있습니다.

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
}

다른 방법은 다음과 같습니다.

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

제가 알기론 어레이를 되돌리고 팝 명령으로 마지막 요소를 가져오기만 하면 됩니다.

   $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: 모델 모형의 10만 런

시간: 1869.3430423737 밀리초

검정 2: 마지막인 경우 모델의 100,000 런

시간: 3235.6359958649 밀리초

또 다른 방법은 이전 루프 사이클 결과를 기억하고 그것을 최종 결과로 사용하는 것입니다.

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

언급URL : https://stackoverflow.com/questions/665135/find-the-last-element-of-an-array-while-using-a-foreach-loop-in-php

반응형