복붙노트

foreach 루프에서 첫 번째와 마지막 반복을 확인하는 방법은 무엇입니까?

PHP

foreach 루프에서 첫 번째와 마지막 반복을 확인하는 방법은 무엇입니까?

질문은 간단합니다. 내 코드에서 foreach 루프가 있습니다.

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

이 루프에서는 첫 번째 또는 마지막 반복에 반응 할 때 다르게 반응합니다.

이 작업을 수행하는 방법?

해결법

  1. ==============================

    1.당신은 카운터를 사용할 수 있습니다 :

    당신은 카운터를 사용할 수 있습니다 :

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

    2.루프 밖에서 카운터를 초기화 할 필요가없는 솔루션을 선호하는 경우 현재 반복 키와 사용자에게 배열의 마지막 / 첫 번째 키를 알려주는 함수를 비교하는 방법을 제안합니다.

    루프 밖에서 카운터를 초기화 할 필요가없는 솔루션을 선호하는 경우 현재 반복 키와 사용자에게 배열의 마지막 / 첫 번째 키를 알려주는 함수를 비교하는 방법을 제안합니다.

    다가올 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!';
    }
    
    foreach($array as $key => $element) {
        reset($array);
        if ($key === key($array))
            echo 'FIRST ELEMENT!';
    
        end($array);
        if ($key === key($array))
            echo 'LAST ELEMENT!';
    }
    
  3. ==============================

    3.마지막 항목을 찾으려면이 코드 조각이 매번 작동한다는 것을 알았습니다.

    마지막 항목을 찾으려면이 코드 조각이 매번 작동한다는 것을 알았습니다.

    foreach( $items as $item ) {
        if( !next( $items ) ) {
            echo 'Last Item';
        }
    }
    
  4. ==============================

    4.위의 단순화 된 버전이며 사용자 정의 색인을 사용하지 않는다고 가정합니다 ...

    위의 단순화 된 버전이며 사용자 정의 색인을 사용하지 않는다고 가정합니다 ...

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

    버전 2 - 나는 필요하다면 else를 사용하여 몹시 싫어하기 때문에.

    $len = count($array);
    foreach ($array as $index => $item) {
        if ($index == 0) {
            // first
            // do something
            continue;
        }
    
        if ($index == $len - 1) {
            // last
            // do something
            continue;
        }
    }
    
  5. ==============================

    5.첫 번째 요소와 마지막 요소를 배열에서 제거하고 별도로 처리 할 수 ​​있습니다. 이렇게 :

    첫 번째 요소와 마지막 요소를 배열에서 제거하고 별도로 처리 할 수 ​​있습니다. 이렇게 :

    <?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) {
      //retirive 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
    }
    ?>
    
  6. ==============================

    6.첫 번째 시도는 다음과 같습니다.

    첫 번째 시도는 다음과 같습니다.

    $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
      }
    }
    
  7. ==============================

    7.단순히 작동합니다!

    단순히 작동합니다!

    //Store the last key
    $lastkey = key(end($array)); 
    foreach($array as $key => $element) {
        ....do array stuff
        if ($lastkey === key($array))
            echo 'LAST ELEMENT!';
    }
    
  8. ==============================

    8.1 : for 문을 사용하지 않는 이유는 무엇입니까? 반복자가 아닌 실제 배열을 사용한다고 가정하면 카운터 변수가 0인지 또는 전체 요소 수보다 작은지를 쉽게 확인할 수 있습니다. 제 생각에 이것은 가장 깨끗하고 이해하기 쉬운 해결책입니다 ...

    1 : for 문을 사용하지 않는 이유는 무엇입니까? 반복자가 아닌 실제 배열을 사용한다고 가정하면 카운터 변수가 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 : 트리 구조를 저장하기 위해 중첩 세트 사용을 고려해야합니다. 또한 재귀 함수를 사용하여 모든 것을 향상시킬 수 있습니다.

  9. ==============================

    9.우수 답변 :

    우수 답변 :

    $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";
    
    }
    
  10. ==============================

    10.SQL 쿼리 생성 스크립트 또는 첫 번째 또는 마지막 요소에 대해 다른 작업을 수행하는 경우 불필요한 변수 검사를 사용하지 않는 것이 훨씬 빠릅니다 (거의 두 배 빠름).

    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 : 모델 모의 100000 실행

    시간 : 1869.3430423737 밀리 초

    test2 : 마지막 모델 인 경우 100000 회 실행

    시간 : 3235.6359958649 밀리 초

    따라서 수표에는 많은 비용이 들며 그 수표는 더 많은 변수 수표를 더 많이 추가합니다.

  11. ==============================

    11.불리언 변수를 사용하는 것은 다음과 같이 $ 값의 첫 번째 모양 (내 상황과 많은 상황에서 더 유용함)을 확인하려는 경우에도 여전히 가장 안정적입니다.

    불리언 변수를 사용하는 것은 다음과 같이 $ 값의 첫 번째 모양 (내 상황과 많은 상황에서 더 유용함)을 확인하려는 경우에도 여전히 가장 안정적입니다.

    $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)를 호출하여 마지막 $ 값을 찾습니다.이 값은 반복 할 next () 값이 없으면 true를 반환합니다.

    그리고 나는 다음과 같이 카운터를 사용하려고한다면 foreach 대신에 for 루프를 사용하는 것을 선호한다.

    $len = count( $array );
    for ( $i = 0; $i < $len; $i++ ) {
        $value = $array[$i];
        if ($i === 0) {
            // first
        } elseif ( $i === $len - 1 ) {
            // last
        }
        // …
        $i++;
    }
    
  12. ==============================

    12.foreach와는 달리 @morg에서 가장 효율적인 대답은 해시 맵 객체가 아닌 올바른 배열에서만 작동합니다. 이 대답은 첫 번째 요소와 마지막 요소를 구체적으로 처리하고 중간 요소를 루핑하여 대부분의 이러한 응답 (수락 된 응답 포함)에서와 같이 루프의 모든 반복에 대한 조건문의 오버 헤드를 방지합니다.

    foreach와는 달리 @morg에서 가장 효율적인 대답은 해시 맵 객체가 아닌 올바른 배열에서만 작동합니다. 이 대답은 첫 번째 요소와 마지막 요소를 구체적으로 처리하고 중간 요소를 루핑하여 대부분의 이러한 응답 (수락 된 응답 포함)에서와 같이 루프의 모든 반복에 대한 조건문의 오버 헤드를 방지합니다.

    array_keys 함수를 사용하여 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++;
    

    나는 이것에 대한 벤치마킹을 해본 적이 없지만 성능에 가장 큰 타격을주는 로직이 루프에 추가되지 않았으므로 효율적인 응답과 함께 제공되는 벤치 마크가 거의 비슷하다고 생각할 수 있습니다.

    이런 종류의 기능화를 원한다면 여기 iterateList 함수에서 스윙을 취했다. 비록 효율성에 대한 관심이 너무 많으면 요점 코드를 벤치마킹 할 수 있습니다. 모든 함수 호출이 얼마나 많은 오버 헤드를 가져올 지 확신하지 못합니다.

  13. ==============================

    13.키와 값을 사용하면 다음과 같이 작동합니다.

    키와 값을 사용하면 다음과 같이 작동합니다.

    foreach ($array as $key => $value) {
        if ($value === end($array)) {
            echo "LAST ELEMENT!";
        }
    }
    
  14. ==============================

    14.나는 같은 문제가 생겼을 때이 스레드를 발견했다. 난 단지 내 마음에 올 때까지 첫 번째 요소를 얻을 필요가 다음 내 코드를 다시 분석해야합니다.

    나는 같은 문제가 생겼을 때이 스레드를 발견했다. 난 단지 내 마음에 올 때까지 첫 번째 요소를 얻을 필요가 다음 내 코드를 다시 분석해야합니다.

    $firstElement = true;
    
    foreach ($reportData->result() as $row) 
    {
           if($firstElement) { echo "first element"; $firstElement=false; }
           // Other lines of codes here
    }
    

    위의 코드는 훌륭하고 완전하지만 첫 번째 요소 만 필요하면이 코드를 사용해보십시오.

  15. ==============================

    15.아직 필요한지 확실하지 않습니다. 그러나 다음 솔루션은 반복자와 함께 작동해야하며 계산이 필요하지 않습니다.

    아직 필요한지 확실하지 않습니다. 그러나 다음 솔루션은 반복자와 함께 작동해야하며 계산이 필요하지 않습니다.

    <?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;
            }
        }
    }
    
  16. ==============================

    16.익명 함수도 사용할 수 있습니다.

    익명 함수도 사용할 수 있습니다.

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

    세 가지 더 언급해야합니다 :

  17. ==============================

    17.카운터 및 배열 길이를 사용할 수 있습니다.

    카운터 및 배열 길이를 사용할 수 있습니다.

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

    18.이 시도:

    이 시도:

    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);
    
  19. from https://stackoverflow.com/questions/1070244/how-to-determine-the-first-and-last-iteration-in-a-foreach-loop by cc-by-sa and MIT license