A menudo se me ocurre manejar datos que pueden ser una matriz o una variable nula y alimentar algunos foreach
con estos datos.
$values = get_values();
foreach ($values as $value){
...
}
Cuando alimenta a un foreach con datos que no son una matriz, recibe una advertencia:
Advertencia: argumento no válido proporcionado para foreach () en [...]
Suponiendo que no es posible refactorizar la get_values()
función para que siempre devuelva una matriz (compatibilidad con versiones anteriores, código fuente no disponible, cualquier otra razón), me pregunto cuál es la forma más limpia y eficiente de evitar estas advertencias:
- Fundición
$values
a matriz - Inicializando
$values
a la matriz - Envolviendo el
foreach
con unif
- Otro (por favor sugiera)
$values
que no sea una matriz.Respuestas:
Personalmente, creo que es la más limpia, ¡no estoy seguro de si es la más eficiente!
La razón de mi preferencia es que no asigna una matriz vacía cuando no tienes nada para empezar de todos modos.
fuente
count()
no es confiable. Si pasacount()
nulo, devuelve 0. Si pasa un argumento no nulo y sin matriz, devuelve 1. Por lo tanto, es imposible de usarcount()
para determinar si la variable es una matriz cuando la variable podría ser una matriz vacía, o Una matriz que contiene 1 elemento.if (is_array($values) || $values instanceof Traversable)
.¿Que tal este? Lote más limpio y todo en una sola línea.
fuente
isset()
ois_array()
ambos, completamente según su escenario, etc.Usualmente uso una construcción similar a esta:
Tenga en cuenta que esta versión en particular no se prueba, se escribe directamente en SO desde la memoria.
Editar: agregada verificación Trazable
fuente
$var instanceof Traversable
. Ver aquí . Porque, por ejemplo, puede predecir un elemento SimpleXMLElement , pero no es una instancia de Iterator o IteratorAggregate.is_object($var)
re. php.net/manual/en/language.oop5.iterations.phpIterator
oIteratorAggregate
, pero eso es, por supuesto, solo mi opinión y, por lo tanto, subjetiva (nunca uso campos públicos).No dependa de la conversión como una solución , aunque otros sugieran esto como una opción válida para evitar un error, podría causar otra.
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.
Escribí una prueba rápida para presentar este problema . (Aquí hay una prueba de respaldo en caso de que falle la primera URL de prueba).
Se incluyen las pruebas de:
null
,false
,true
, unclass
, unaarray
yundefined
.Siempre pruebe su entrada antes de usarla en foreach. Sugerencias:
$array = is_array($var) or is_object($var) ? $var : [] ;
try{}catch(){}
bloquesarray_key_exists
una clave específica o probar la profundidad de una matriz (¡cuando es una!) .fuente
Prueba esto:
;)
fuente
El problema siempre es nulo y, de hecho, la fundición es la solución de limpieza.
fuente
En primer lugar, cada variable debe ser inicializada. Siempre.
El casting no es una opción.
si get_values (); puede devolver una variable de tipo diferente, este valor debe ser verificado, por supuesto.
fuente
$array = (array)null;
, obtendrá una matriz vacía. Por supuesto, es un desperdicio de asignación de memoria ;-)Extensión más concisa del código de @ Kris
especialmente para usar código interno de plantilla
fuente
return is_iterable($var) ? $var : array($var);
?Si está usando php7 y desea manejar solo errores indefinidos, esta es la IMHO más limpia
fuente
Esto no comprueba si se trata de una matriz, pero omite el ciclo si la variable es nula o una matriz vacía.
fuente
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 use la misma versión de PHP que usa su sitio anterior.
Si no está migrando su sitio y esto es solo un problema que ha surgido, intente actualizar a PHP 5. Esto soluciona algunos de estos problemas. Puede parecer una solución tonta, pero me funcionó.
fuente
Se produce un caso excepcional para este aviso si configura la matriz como nula dentro del bucle foreach
fuente
¿Qué tal esta solución?
fuente
Argumento de advertencia no válido proporcionado para
foreach()
mostrar tweets. ir a/wp-content/plugins/display-tweets-php
. Luego inserte este código en la línea número 591, se ejecutará perfectamente.fuente
if (is_array($_POST['auto'])){ // code }
También parece haber una relación con el medio ambiente:
Tuve ese error de "argumento no válido proporcionado foreach ()" solo en el entorno de desarrollo, 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))
alrededorforeach ($array as $subarray)
resolvió el problema.Lo siento, no puedo explicar la causa, pero como me llevó un tiempo encontrar una solución, pensé en compartir esto mejor como una observación.
fuente
Use la función is_array, cuando pasará la matriz a foreach loop.
fuente
¿Qué pasa con la definición de una matriz vacía como alternativa si
get_value()
está vacía?No puedo pensar en un camino más corto.
fuente
Usaré una combinación de
empty
,isset
yis_array
comofuente
Haría lo mismo que Andy, pero usaría la función 'vacía'.
al igual que:
fuente
$yourArray = 1;
intenta iterar, y obtendrás el error.empty()
No es una prueba adecuada.