[php] foreach 루프에서 첫 번째와 마지막 반복을 결정하는 방법은 무엇입니까?

질문은 간단합니다. 나는이 foreach내 코드에서 루프를 :

foreach($array as $element) {
    //code
}

이 루프에서는 처음 또는 마지막 반복에있을 때 다르게 반응하고 싶습니다.

이것을하는 방법?



답변

카운터를 사용할 수 있습니다.

$i = 0;
$len = count($array);
foreach ($array as $item) {
    if ($i == 0) {
        // first
    } else if ($i == $len - 1) {
        // last
    }
    // …
    $i++;
}


답변

루프 외부에서 카운터를 초기화하지 않아도되는 솔루션을 선호하는 경우 현재 반복 키를 배열의 마지막 / 첫 번째 키를 알려주는 함수와 비교하는 것이 좋습니다.

이것은 다가오는 PHP 7.3에서 다소 더 효율적이고 읽기 쉽습니다.

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 버전에 대한 솔루션 :

foreach($array as $key => $element) {
    reset($array);
    if ($key === key($array))
        echo 'FIRST ELEMENT!';

    end($array);
    if ($key === key($array))
        echo 'LAST ELEMENT!';
}


답변

마지막 항목을 찾기 위해 매번이 코드가 작동한다는 것을 알았습니다.

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에게 감사드립니다 .