PHP Foreach 루프에서 처음과 마지막 반복을 결정하는 방법
문은간간 간간간다다는 나나 a a a가 있다foreach
code : 드드코코코 loop loop loop loop :
foreach($array as $element) {
//code
}
이 루프에서는 첫 번째 또는 마지막 반복일 때 다르게 반응하고 싶습니다.
이거 어떻게 하는 거야?
루프 외부에서 카운터를 초기화할 필요가 없는 솔루션을 원하는 경우 현재 반복 키를 배열의 마지막/첫 번째 키를 알려주는 함수와 비교할 수 있습니다.
PHP 7.3 이후:
foreach ($array as $key => $element) {
if ($key === array_key_first($array)) {
echo 'FIRST ELEMENT!';
}
if ($key === array_key_last($array)) {
echo 'LAST ELEMENT!';
}
}
PHP 7.2 이전 버전:
PHP 7.2는 이미 EOL(End of Life)이기 때문에, 이것은 단지 과거의 참조로서 여기에 있습니다.사용을 피한다.
foreach ($array as $key => $element) {
reset($array);
if ($key === key($array)) {
echo 'FIRST ELEMENT!';
}
end($array);
if ($key === key($array)) {
echo 'LAST ELEMENT!';
}
}
카운터를 사용할 수 있습니다.
$i = 0;
$len = count($array);
foreach ($array as $item) {
if ($i == 0) {
// first
} else if ($i == $len - 1) {
// last
}
// …
$i++;
}
마지막 항목을 찾기 위해 매번 이 코드가 작동합니다.
foreach( $items as $item ) {
if( !next( $items ) ) {
echo 'Last Item';
}
}
위의 간단한 버전으로 사용자 지정 인덱스를 사용하지 않는다고 가정하면...
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
} else if ($index == $len - 1) {
// last
}
}
버전 2 - 필요한 경우가 아니면 다른 것을 사용하는 것을 싫어하기 때문입니다.
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
// do something
continue;
}
if ($index == $len - 1) {
// last
// do something
continue;
}
}
어레이에서 첫 번째 요소와 마지막 요소를 제거하고 개별적으로 처리할 수 있습니다.
다음과 같이 합니다.
<?php
$array = something();
$first = array_shift($array);
$last = array_pop($array);
// do something with $first
foreach ($array as $item) {
// do something with $item
}
// do something with $last
?>
인라인 태그 대신 CSS로 포맷을 모두 삭제하면 코드가 개선되어 로드 시간이 단축됩니다.
HTML과 php 로직의 혼재도 가능하면 피할 수 있습니다.
다음과 같이 구분하여 페이지를 보다 읽기 쉽고 유지 관리할 수 있습니다.
<?php
function create_menu($params) {
//retrieve menu items
//get collection
$collection = get('xxcollection') ;
foreach($collection as $c) show_collection($c);
}
function show_subcat($val) {
?>
<div class="sub_node" style="display:none">
<img src="../images/dtree/join.gif" align="absmiddle" style="padding-left:2px;" />
<a id="'.$val['xsubcatid'].'" href="javascript:void(0)" onclick="getProduct(this , event)" class="sub_node_links" >
<?php echo $val['xsubcatname']; ?>
</a>
</div>
<?php
}
function show_cat($item) {
?>
<div class="node" >
<img src="../images/dtree/plus.gif" align="absmiddle" class="node_item" id="plus" />
<img src="../images/dtree/folder.gif" align="absmiddle" id="folder">
<?php echo $item['xcatname']; ?>
<?php
$subcat = get_where('xxsubcategory' , array('xcatid'=>$item['xcatid'])) ;
foreach($subcat as $val) show_subcat($val);
?>
</div>
<?php
}
function show_collection($c) {
?>
<div class="parent" style="direction:rtl">
<img src="../images/dtree/minus.gif" align="absmiddle" class="parent_item" id="minus" />
<img src="../images/dtree/base.gif" align="absmiddle" id="base">
<?php echo $c['xcollectionname']; ?>
<?php
//get categories
$cat = get_where('xxcategory' , array('xcollectionid'=>$c['xcollectionid']));
foreach($cat as $item) show_cat($item);
?>
</div>
<?php
}
?>
첫 번째 검색 시도는 다음과 같습니다.
$first = true;
foreach ( $obj as $value )
{
if ( $first )
{
// do something
$first = false; //in order not to get into the if statement for the next loops
}
else
{
// do something else for all loops except the first
}
}
간단해!
// Set the array pointer to the last key
end($array);
// Store the last key
$lastkey = key($array);
foreach($array as $key => $element) {
....do array stuff
if ($lastkey === key($array))
echo 'THE LAST ELEMENT! '.$array[$lastkey];
}
@billynoah 님의 최종호 정리 감사합니다.
심플한1을 안 돼요?for
테 assuming ? and and and and and and and and and and and가 아니라 실제 Iterator
카운터 변수가 0인지 또는 전체 원소 수보다 하나 적은지 쉽게 확인할 수 있습니다.제 생각에는 이게 가장 깨끗하고 이해할 수 있는 해결책입니다.
$array = array( ... );
$count = count( $array );
for ( $i = 0; $i < $count; $i++ )
{
$current = $array[ $i ];
if ( $i == 0 )
{
// process first element
}
if ( $i == $count - 1 )
{
// process last element
}
}
2: 트리 구조를 저장하기 위해 중첩 집합을 사용하는 것을 고려해야 합니다.또한 재귀 함수를 사용하여 전체 기능을 개선할 수 있습니다.
최적의 답변:
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
foreach ($arr as $a) {
// This is the line that does the checking
if (!each($arr)) echo "End!\n";
echo $a."\n";
}
@morg에서 가장 효율적인 답변을 얻을 수 있습니다.foreach
는 적절한 배열에서만 동작하며 해시 맵개체는 동작하지 않습니다.이 응답은 루프의 모든 반복에 대해 조건문의 오버헤드를 회피합니다.이러한 응답의 대부분(허용된 응답 포함)에서는 첫 번째 요소와 마지막 요소를 구체적으로 처리하여 중간 요소를 루프합니다.
이 기능을 사용하여 다음과 같은 효율적인 답변을 수행할 수 있습니다.foreach
:
$keys = array_keys($arr);
$numItems = count($keys);
$i=0;
$firstItem=$arr[$keys[0]];
# Special handling of the first item goes here
$i++;
while($i<$numItems-1){
$item=$arr[$keys[$i]];
# Handling of regular items
$i++;
}
$lastItem=$arr[$keys[$i]];
# Special handling of the last item goes here
$i++;
이에 대한 벤치마킹은 실시하지 않았습니다만, 퍼포먼스의 최대 히트인 루프는 논리가 추가되어 있지 않기 때문에, 효율적인 답변에 의한 벤치마크에 매우 가까운 것으로 생각됩니다.
만약 당신이 이런 종류의 기능을 하고 싶다면, 저는 여기서 반복 목록 함수를 시도해 보았습니다.다만, 효율이 매우 염려되는 경우는, 지스트 코드를 벤치마킹 하는 것이 좋습니다.모든 함수 호출에 따른 오버헤드가 어느 정도인지 알 수 없습니다.
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 밀리초
따라서 체크에 비용이 많이 드는 것은 분명합니다.물론 변동성이 높은 체크가 추가될수록 더 악화됩니다.
키와 값을 사용하면 다음과 같이 동작합니다.
foreach ($array as $key => $value) {
if ($value === end($array)) {
echo "LAST ELEMENT!";
}
}
첫에도 부울 하는 것이 신뢰할 수 있습니다.이것은, 의 첫 번째 어피아란스를 체크하는 경우에서도,$value
(내 상황과 많은 상황에서 더 유용하게 사용할 수 있었습니다) 다음과 같습니다.
$is_first = true;
foreach( $array as $value ) {
switch ( $value ) {
case 'match':
echo 'appeared';
if ( $is_first ) {
echo 'first appearance';
$is_first = false;
}
break;
}
}
if( !next( $array ) ) {
echo 'last value';
}
}
ㅇㅇㅇㅇ는 요?!next( $array )
을 $value
은 반환될 것이다.true
next()
반복할 가치.
그리고 저는 이 제품을 사용하는 것을 선호합니다.for
foreach
'CHANGE: 'CHANGE: 'CHANGE: 'CHANGE:
$len = count( $array );
for ( $i = 0; $i < $len; $i++ ) {
$value = $array[$i];
if ($i === 0) {
// first
} elseif ( $i === $len - 1 ) {
// last
}
// …
$i++;
}
나는 같은 문제가 있을 때 우연히 이 실마리를 찾았다.첫 번째 요소만 얻으면 됩니다.그게 생각날 때까지 코드를 다시 분석합니다.
$firstElement = true;
foreach ($reportData->result() as $row)
{
if($firstElement) { echo "first element"; $firstElement=false; }
// Other lines of codes here
}
위의 코드는 완전하지만 첫 번째 요소만 필요한 경우 이 코드를 사용해 보십시오.
reset($array) 및 end($array) 사용
<?php
$arrays = [1,2,3,4,5];
$first = reset($arrays);
$last = end($arrays);
foreach( $arrays as $array )
{
if ( $first == $array )
{
echo "<li>{$array} first</li>";
}
else if ( $last == $array )
{
echo "<li>{$array} last</li>";
}
else
{
echo "<li>{$array}</li>";
}
}
그러나 작동해야 반복기를 필요로 하지 .count
.
<?php
foreach_first_last(array(), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
foreach_first_last(array('aa'), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
echo PHP_EOL;
foreach_first_last(array('aa', 'bb', 'cc'), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
echo PHP_EOL;
function foreach_first_last($array, $cb)
{
$next = false;
$current = false;
reset($array);
for ($step = 0; true; ++$step) {
$current = $next;
$next = each($array);
$last = ($next === false || $next === null);
if ($step > 0) {
$first = $step == 1;
list ($key, $value) = $current;
if (call_user_func($cb, $key, $value, $step, $first, $last) === false) {
break;
}
}
if ($last) {
break;
}
}
}
어나니머스 기능도 사용할 수 있습니다.
$indexOfLastElement = count($array) - 1;
array_walk($array, function($element, $index) use ($indexOfLastElement) {
// do something
if (0 === $index) {
// first element‘s treatment
}
if ($indexOfLastElement === $index) {
// last not least
}
});
다음 세 가지를 더 언급해야 합니다.
- 어레이가 엄밀하게(수치적으로) 인덱싱되지 않은 경우 어레이를 통해
array_values
첫번째. - 를 변경할 필요가 있는 경우
$element
참조로 통과해야 합니다.&$element
). - 익명의 함수 내부에서 필요한 외부로부터의 변수는 다음 목록 옆에 나열해야 합니다.
$indexOfLastElement
내부use
필요한 경우 참조를 통해 다시 구성합니다.
카운터와 어레이 길이를 사용할 수 있습니다.
$array = 어레이(1,2,3,4); $i = 0;$len = 카운트 어레이); foreach ($항목으로서 어레이){($i === 0)의 경우,// 먼저} ($i === $len - 1)의 경우 이외// 마지막}// …$i++;}
foreach ($arquivos as $key => $item) {
reset($arquivos);
// FIRST AHEAD
if ($key === key($arquivos) || $key !== end(array_keys($arquivos)))
$pdf->cat(null, null, $key);
// LAST
if ($key === end(array_keys($arquivos))) {
$pdf->cat(null, null, $key)
->execute();
}
}
가장 간단한 방법은
$array = [9,5,6,4,7,8];
$current_iteration = 0;
foreach($array as $item){
if( 0 === $current_iteration ){
echo 'this is the first item: ' . $item;
}
if( (count($array) - 1) === $current_iteration){
echo 'this is the last item: ' . $item;
}
$current_iteration++;
}
이것을 시험해 보세요.
function children( &$parents, $parent, $selected ){
if ($parents[$parent]){
$list = '<ul>';
$counter = count($parents[$parent]);
$class = array('first');
foreach ($parents[$parent] as $child){
if ($child['id'] == $selected) $class[] = 'active';
if (!--$counter) $class[] = 'last';
$list .= '<li class="' . implode(' ', $class) . '"><div><a href="]?id=' . $child['id'] . '" alt="' . $child['name'] . '">' . $child['name'] . '</a></div></li>';
$class = array();
$list .= children($parents, $child['id'], $selected);
}
$list .= '</ul>';
return $list;
}
}
$output .= children( $parents, 0, $p_industry_id);
언급URL : https://stackoverflow.com/questions/1070244/php-how-to-determine-the-first-and-last-iteration-in-a-foreach-loop
'programing' 카테고리의 다른 글
mysql 외부 키 제약 조건이 잘못된 형식 오류입니다. (0) | 2023.01.04 |
---|---|
이름 목록을 반복하고 색상 목록을 반복하고 배경 색상 스타일을 해당 이름 중 하나에 바인딩합니다. (0) | 2023.01.04 |
요청의 URL에서 최대 재시도 횟수를 초과했습니다. (0) | 2023.01.04 |
SQL(MariaDB)에서 SELECT 문구가 중복되지 않도록 하는 방법 (0) | 2023.01.04 |
헤더 파일에서 함수를 "외부"로 만들어야 합니까? (0) | 2023.01.04 |