복붙노트

foreach ()에 잘못된 인수가 제공되었습니다.

PHP

foreach ()에 잘못된 인수가 제공되었습니다.

배열이나 널 (null) 변수가 될 수있는 데이터를 처리하고 이러한 데이터로 foreach를 공급하는 일은 종종 내게 일어난다.

$values = get_values();

foreach ($values as $value){
  ...
}

foreach에 배열이 아닌 데이터를 제공하면 경고 메시지가 나타납니다.

get_values ​​() 함수가 항상 배열 (이전 버전과의 호환성, 사용 가능한 소스 코드가 아닌 다른 이유)을 반환하도록 리팩터링 할 수 없다고 가정하면 이러한 경고를 피하는 가장 깨끗하고 효율적인 방법이 궁금합니다.

해결법

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

    1.

    개인적으로 이것이 가장 깨끗한 것으로 나타났습니다 - 이것이 가장 효율적인, 마음인지 확실하지 않습니다!

    if (is_array($values) || is_object($values))
    {
        foreach ($values as $value)
        {
            ...
        }
    }
    

    어쨌든 아무것도 시작할 필요가 없을 때 빈 배열을 할당하지 않는다는 점이 내가 선호하는 이유입니다.

  2. ==============================

    2.

    이건 어때? 많은 청소기와 모두 한 줄에.

    foreach ((array) $items as $item) {
     // ...
     }
    
  3. ==============================

    3.

    나는 보통 이와 비슷한 구조를 사용한다.

    /**
     * Determine if a variable is iterable. i.e. can be used to loop over.
     *
     * @return bool
     */
    function is_iterable($var)
    {
        return $var !== null 
            && (is_array($var) 
                || $var instanceof Traversable 
                || $var instanceof Iterator 
                || $var instanceof IteratorAggregate
                );
    }
    
    $values = get_values();
    
    if (is_iterable($values))
    {
        foreach ($values as $value)
        {
            // do stuff...
        }
    }
    

    이 특정 버전은 테스트되지 않았으며 메모리에서 SO로 직접 입력되었습니다.

    편집 : Traversable 체크 추가

  4. ==============================

    4.

    솔루션으로 캐스팅을 사용하지 마십시오. 다른 사람들이이를 오류를 방지하기위한 유효한 옵션으로 제안하더라도 다른 경고가 발생할 수 있습니다.

    주의 사항 : 특정 형식의 배열이 반환되기를 기대하는 경우이 방법으로 실패 할 수 있습니다. 더 많은 수표가 필요합니다.

    나는이 문제를 제시 할 수있는 간단한 테스트를 작성했다. (첫 번째 테스트 URL이 실패 할 경우를 대비 한 백업 테스트입니다.)

    null, false, true, 클래스, 배열 및 undefined에 대한 테스트가 포함됩니다.

    foreach에서 사용하기 전에 항상 입력을 테스트하십시오. 제안 :

  5. ==============================

    5.

    이 시도:

    //Force array
    $dataArr = is_array($dataArr) ? $dataArr : array($dataArr);
    foreach ($dataArr as $val) {
      echo $val;
    }
    

    ;)

  6. ==============================

    6.

    $values = get_values();
    
    foreach ((array) $values as $value){
      ...
    }
    

    문제는 항상 null이며 캐스팅은 실제로 세척 솔루션입니다.

  7. ==============================

    7.

    우선, 모든 변수를 초기화해야합니다. 항상. 주조는 옵션이 아닙니다. if get_values ​​(); 다른 유형의 변수를 반환 할 수 있습니다. 물론이 값을 확인해야합니다.

  8. ==============================

    8.

    @ Kris 코드의보다 간결한 확장

    function secure_iterable($var)
    {
        return is_iterable($var) ? $var : array();
    }
    
    foreach (secure_iterable($values) as $value)
    {
         //do stuff...
    }
    

    특히 내부 템플릿 코드 사용

    <?php foreach (secure_iterable($values) as $value): ?>
        ...
    <?php endforeach; ?>
    
  9. ==============================

    9.

    foreach ($arr ? $arr : [] as $elem) {
        // Does something 
    }
    

    이것은 배열인지 검사하지 않지만 변수가 null이거나 빈 배열 인 경우 루프를 건너 뜁니다.

  10. ==============================

    10.

    php7을 사용하고 있으며 정의되지 않은 오류 만 처리하려는 경우 가장 깨끗한 IMHO입니다.

    $array = [1,2,3,4];
    foreach ( $array ?? [] as $item ) {
      echo $item;
    }
    
  11. ==============================

    11.

    이것이 사실인지 확실하지 않지만이 문제는 워드 프레스 사이트를 마이그레이션하거나 일반적으로 동적 사이트를 마이그레이션 할 때 여러 번 발생하는 것으로 보입니다. 이 경우 이주하려는 호스트가 이전 사이트에서 사용하는 것과 동일한 PHP 버전을 사용하는지 확인하십시오.

    사이트를 이전하지 않는 경우 PHP 5로 업데이트하려고하면 문제가 발생합니다. 이러한 문제가 발생합니다. 어리석은 해결책처럼 보일지도 모르지만 나를 위해 트릭을했습니다.

  12. ==============================

    12.

    foreach 루프 내에서 array를 null로 설정하면 예외가 발생합니다

    if (is_array($values))
    {
        foreach ($values as $value)
        {
            $values = null;//WARNING!!!
        }
    }
    
  13. ==============================

    13.

    이 솔루션은 어떻습니까?

    $type = gettype($your_iteratable);
    $types = array(
        'array',
        'object'
    );
    
    if (in_array($type, $types)) {
        // foreach code comes here
    }
    
  14. ==============================

    14.

    또한 환경과의 관계가있는 것처럼 보입니다.

    나는 "잘못된 인수를 foreach ()"dev에 환경에서만 제공하지만, 찌르다 (나는 서버가 아닌 localhost에서 일하고있다) 오류가 발생했습니다.

    오류에도 불구하고 var_dump는 배열이 잘 있음을 나타냅니다 (app 및 dev의 경우 모두).

    foreach ($ 배열로 $ 배열) 주위의 if (is_array ($ array))는 문제를 해결했습니다.

    죄송합니다. 원인을 설명 할 수는 없지만 해결책을 찾아내는 데 다소 시간이 걸렸으므로 이것을 관찰과 공유하는 것이 더 좋습니다.

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

    15.

    빈, isset 및 is_array의 조합을 다음과 같이 사용합니다.

    $array = ['dog', 'cat',  'lion'];
    
    if(!empty($array)  && isset($array)  && is_array($array){
    //loop
    foreach ($array as $values) {
    echo $values; 
    }
    }
    
  16. ==============================

    16.

    foreach 루프에 배열을 전달할 때 is_array 함수를 사용하십시오.

    if (is_array($your_variable)) {
      foreach ($your_variable as $item) {
       //your code
    }
    }
    
  17. ==============================

    17.

    foreach () 트윗 표시에 잘못된 경고 인수가 제공되었습니다. "/ wp-content / plugins / display-tweets-php"로 이동하십시오. 그런 다음이 코드를 행 번호 591에 삽입하면 완벽하게 실행됩니다.

    if (is_array($tweets)){  
            foreach ( $tweets as $tweet ) 
        {
            ...
        }
    }
    
  18. ==============================

    18.

    Andy와 같은 일을하지만 '빈'기능을 사용합니다.

    이렇게 :

    if(empty($yourArray))
    {echo"<p>There's nothing in the array.....</p>";}
    else
    {
    foreach ($yourArray as $current_array_item)
      {
        //do something with the current array item here
      } 
    }
    
  19. from https://stackoverflow.com/questions/2630013/invalid-argument-supplied-for-foreach by cc-by-sa and MIT lisence