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!";
}
}
해서 '배열하다 '하다', '배열하다', '배열하다'를 반복할 foreach
manager로 지정합니다.
은 배열의 마지막 키를 사용하여 수 .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
'programing' 카테고리의 다른 글
동적 html 로드 후 클릭 이벤트를 추가하기 위한 jQuery .live() vs .on() 메서드 (0) | 2022.10.01 |
---|---|
MariaDB UNIX_TIMESTamp()가 미래의 날짜를 사용할 때 NULL을 반환합니다. (0) | 2022.10.01 |
MySQL: 다른 컬럼의 변경에 따라 컬럼에 순차적으로 지정 (0) | 2022.10.01 |
목록의 항목을 단일 문자열에 연결하려면 어떻게 해야 합니까? (0) | 2022.10.01 |
두 개 이상의 필드를 조합하여 검증하려면 어떻게 해야 합니까? (0) | 2022.10.01 |