foreach ()에 잘못된 인수가 제공되었습니다.
PHPforeach ()에 잘못된 인수가 제공되었습니다.
배열이나 널 (null) 변수가 될 수있는 데이터를 처리하고 이러한 데이터로 foreach를 공급하는 일은 종종 내게 일어난다.
$values = get_values();
foreach ($values as $value){
...
}
foreach에 배열이 아닌 데이터를 제공하면 경고 메시지가 나타납니다.
get_values () 함수가 항상 배열 (이전 버전과의 호환성, 사용 가능한 소스 코드가 아닌 다른 이유)을 반환하도록 리팩터링 할 수 없다고 가정하면 이러한 경고를 피하는 가장 깨끗하고 효율적인 방법이 궁금합니다.
해결법
-
==============================
1.
개인적으로 이것이 가장 깨끗한 것으로 나타났습니다 - 이것이 가장 효율적인, 마음인지 확실하지 않습니다!
if (is_array($values) || is_object($values)) { foreach ($values as $value) { ... } }
어쨌든 아무것도 시작할 필요가 없을 때 빈 배열을 할당하지 않는다는 점이 내가 선호하는 이유입니다.
-
==============================
2.
이건 어때? 많은 청소기와 모두 한 줄에.
foreach ((array) $items as $item) { // ... }
-
==============================
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.
솔루션으로 캐스팅을 사용하지 마십시오. 다른 사람들이이를 오류를 방지하기위한 유효한 옵션으로 제안하더라도 다른 경고가 발생할 수 있습니다.
주의 사항 : 특정 형식의 배열이 반환되기를 기대하는 경우이 방법으로 실패 할 수 있습니다. 더 많은 수표가 필요합니다.
나는이 문제를 제시 할 수있는 간단한 테스트를 작성했다. (첫 번째 테스트 URL이 실패 할 경우를 대비 한 백업 테스트입니다.)
null, false, true, 클래스, 배열 및 undefined에 대한 테스트가 포함됩니다.
foreach에서 사용하기 전에 항상 입력을 테스트하십시오. 제안 :
-
==============================
5.
이 시도:
//Force array $dataArr = is_array($dataArr) ? $dataArr : array($dataArr); foreach ($dataArr as $val) { echo $val; }
;)
-
==============================
6.
$values = get_values(); foreach ((array) $values as $value){ ... }
문제는 항상 null이며 캐스팅은 실제로 세척 솔루션입니다.
-
==============================
7.
우선, 모든 변수를 초기화해야합니다. 항상. 주조는 옵션이 아닙니다. if get_values (); 다른 유형의 변수를 반환 할 수 있습니다. 물론이 값을 확인해야합니다.
-
==============================
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.
foreach ($arr ? $arr : [] as $elem) { // Does something }
이것은 배열인지 검사하지 않지만 변수가 null이거나 빈 배열 인 경우 루프를 건너 뜁니다.
-
==============================
10.
php7을 사용하고 있으며 정의되지 않은 오류 만 처리하려는 경우 가장 깨끗한 IMHO입니다.
$array = [1,2,3,4]; foreach ( $array ?? [] as $item ) { echo $item; }
-
==============================
11.
이것이 사실인지 확실하지 않지만이 문제는 워드 프레스 사이트를 마이그레이션하거나 일반적으로 동적 사이트를 마이그레이션 할 때 여러 번 발생하는 것으로 보입니다. 이 경우 이주하려는 호스트가 이전 사이트에서 사용하는 것과 동일한 PHP 버전을 사용하는지 확인하십시오.
사이트를 이전하지 않는 경우 PHP 5로 업데이트하려고하면 문제가 발생합니다. 이러한 문제가 발생합니다. 어리석은 해결책처럼 보일지도 모르지만 나를 위해 트릭을했습니다.
-
==============================
12.
foreach 루프 내에서 array를 null로 설정하면 예외가 발생합니다
if (is_array($values)) { foreach ($values as $value) { $values = null;//WARNING!!! } }
-
==============================
13.
이 솔루션은 어떻습니까?
$type = gettype($your_iteratable); $types = array( 'array', 'object' ); if (in_array($type, $types)) { // foreach code comes here }
-
==============================
14.
또한 환경과의 관계가있는 것처럼 보입니다.
나는 "잘못된 인수를 foreach ()"dev에 환경에서만 제공하지만, 찌르다 (나는 서버가 아닌 localhost에서 일하고있다) 오류가 발생했습니다.
오류에도 불구하고 var_dump는 배열이 잘 있음을 나타냅니다 (app 및 dev의 경우 모두).
foreach ($ 배열로 $ 배열) 주위의 if (is_array ($ array))는 문제를 해결했습니다.
죄송합니다. 원인을 설명 할 수는 없지만 해결책을 찾아내는 데 다소 시간이 걸렸으므로 이것을 관찰과 공유하는 것이 더 좋습니다.
-
==============================
15.
빈, isset 및 is_array의 조합을 다음과 같이 사용합니다.
$array = ['dog', 'cat', 'lion']; if(!empty($array) && isset($array) && is_array($array){ //loop foreach ($array as $values) { echo $values; } }
-
==============================
16.
foreach 루프에 배열을 전달할 때 is_array 함수를 사용하십시오.
if (is_array($your_variable)) { foreach ($your_variable as $item) { //your code } }
-
==============================
17.
foreach () 트윗 표시에 잘못된 경고 인수가 제공되었습니다. "/ wp-content / plugins / display-tweets-php"로 이동하십시오. 그런 다음이 코드를 행 번호 591에 삽입하면 완벽하게 실행됩니다.
if (is_array($tweets)){ foreach ( $tweets as $tweet ) { ... } }
-
==============================
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 } }
from https://stackoverflow.com/questions/2630013/invalid-argument-supplied-for-foreach by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
PHP + 컬, HTTP POST 샘플 코드? (0) | 2018.09.03 |
---|---|
PHP를 사용하여 cron 작업을 만드는 방법은 무엇입니까? (0) | 2018.09.03 |
PHP 'foreach'는 실제로 어떻게 작동합니까? (0) | 2018.09.02 |
YouTube API에서 YouTube 동영상 미리보기 이미지를 얻으려면 어떻게해야합니까? (0) | 2018.09.02 |
PHP_excel의 대안 (0) | 2018.09.02 |