warning supplied solucion significa que invalid for argument php foreach

php - solucion - Invalid argument supplied for foreach()



que significa warning invalid argument supplied for foreach() (18)

¿Qué hay de esta solución:

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

A menudo me ocurre manejar datos que pueden ser una matriz o una variable nula y alimentar a alguien con estos datos.

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

Cuando alimenta un foreach con datos que no son una matriz, aparece una advertencia:

Advertencia: se proporcionó un argumento no válido para foreach () en [...]

Suponiendo que no es posible refactorizar la función get_values() para devolver siempre una matriz (compatibilidad con versiones anteriores, código fuente no disponible, por cualquier otra razón), me pregunto cuál es la forma más limpia y eficiente de evitar estas advertencias:

  • Casting $values a la matriz
  • Inicializando $values a la matriz
  • Envolviendo el foreach con un if
  • Otro (por favor sugiera)

¿Que tal este? Lote más limpio y todo en una sola línea.

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


Advertencia argumento inválido proporcionado para foreach () mostrar tweets. vaya a "/ wp-content / plugins / display-tweets-php". Luego inserte este código en la línea número 591, se ejecutará perfectamente.

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


El caso excepcional para este aviso se produce si establece la matriz en nulo dentro del bucle foreach

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


En primer lugar, cada variable debe ser inicializada. Siempre.
Casting no es una opción.
si get_values ​​(); Puede devolver una variable de tipo diferente, este valor debe ser verificado, por supuesto.


Extensión más concisa del código de @Kris.

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

especialmente para usar dentro de código de plantilla

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


Haría lo mismo que Andy, pero utilizaría la función "vacío".

al igual que:

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 } }


No estoy seguro de si este es el caso, pero este problema parece ocurrir varias veces al migrar sitios de wordpress o migrar sitios dinámicos en general. Si este es el caso, asegúrese de que el alojamiento al que está migrando utiliza la misma versión de PHP que usa su sitio anterior.

Si no está migrando su sitio y este es solo un problema que se le ha ocurrido, intente actualizar a PHP 5. Esto soluciona algunos de estos problemas. Puede parecer una solución tonta pero hizo el truco para mí.


Personalmente, considero que esto es lo más limpio, ¡no estoy seguro de si es la mente más eficiente!

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

La razón de mi preferencia es que no asigna una matriz vacía cuando no tienes nada con lo que empezar.


Prueba esto:

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

;)


Si está usando php7 y quiere manejar solo errores no definidos, este es el IMHO más limpio

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


También parece haber una relación con el medio ambiente:

Recibí ese error "argumento no válido proporcionado para cada ()" solo en el entorno dev, pero no en prod (estoy trabajando en el servidor, no localhost).

A pesar del error, var_dump indicó que la matriz estaba bien allí (en ambos casos, app y dev).

El if (is_array($array)) alrededor del foreach ($array as $subarray) resolvió el problema.

Lo siento, no puedo explicar la causa, pero como me tomó un tiempo encontrar una solución, pensé en compartir mejor esto como una observación.


Usaré una combinación de empty, isset y is_array como

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


Usualmente uso una construcción similar a esta:

/** * 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... } }

Tenga en cuenta que esta versión en particular no se prueba, se escribe directamente en SO desde la memoria.

Edición: añadido cheque Traversable


No dependa del lanzamiento como una solución , aunque otros sugieren que esto es una opción válida para evitar un error, podría causar otro.

Tenga en cuenta: si espera que se devuelva una forma específica de matriz, esto podría fallarle. Se requieren más controles para eso.

Por ejemplo, convertir un booleano en un array (array)bool , NO resultará en un array vacío, sino en un array con un elemento que contiene el valor booleano como un int: [0=>0] o [0=>1] .

Escribí una prueba rápida para presentar este problema . (Aquí hay una prueba de respaldo en caso de que la primera url de prueba falle).

Se incluyen las pruebas para: null , false , true , una class , una array y undefined .

Siempre pruebe su entrada antes de usarla en foreach. Sugerencias:

  1. Comprobación rápida de tipo : $array = is_array($var) or is_object($var) ? $var : [] ; $array = is_array($var) or is_object($var) ? $var : [] ;
  2. Escriba las matrices de sugerencias en los métodos antes de usar foreach y especifique los tipos de devolución.
  3. Envolviendo foreach dentro de si
  4. Usando los bloques try{}catch(){}
  5. Diseño de código / prueba adecuada antes de lanzamientos de producción
  6. Para probar una matriz contra la forma adecuada, puede usar array_key_exists en una clave específica, o probar la profundidad de una matriz (¡cuando es una!) .
  7. Siempre extraiga sus métodos de ayuda en el espacio de nombres global de manera que reduzca el código duplicado

Use la función is_array, cuando pase la matriz a foreach loop.

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


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

El problema siempre es nulo y Casting es, de hecho, la solución de limpieza.


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

Esto no comprueba si es una matriz, pero omite el bucle si la variable es nula o una matriz vacía.