일부 매개 변수를 사용하여 SQL 쿼리 작성자를 작성 중입니다. Java에서는 배열 길이로 현재 배열 위치를 확인하면 for 루프 내부에서 배열의 마지막 요소를 매우 쉽게 감지 할 수 있습니다.
for(int i=0; i< arr.length;i++){
boolean isLastElem = i== (arr.length -1) ? true : false;
}
PHP에서는 배열에 액세스하기 위해 정수가 아닌 인덱스를 가지고 있습니다. 따라서 foreach 루프를 사용하여 배열을 반복해야합니다. 이것은 어떤 결정을 내려야 할 때 문제가됩니다 (제 경우에는 쿼리를 작성하는 동안 추가 또는 매개 변수).
이 작업을 수행하는 표준 방법이 있어야합니다.
PHP에서 어떻게 해결합니까?
답변
다음과 같이 원하는 것처럼 들립니다.
$numItems = count($arr);
$i = 0;
foreach($arr as $key=>$value) {
if(++$i === $numItems) {
echo "last index!";
}
}
즉, foreach
PHP에서 사용하는 “배열”을 반복하지는 않습니다 .
답변
배열의 마지막 키 값을 사용 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
}
}
답변
왜 그렇게 복잡한가?
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
}
}
답변
따라서 배열에 고유 한 배열 값이 있으면 마지막 반복을 결정하는 것이 쉽지 않습니다.
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 연산자를 참고하십시오.이 경우에는 매우 중요합니다.