la forma más limpia de omitir un foreach si la matriz está vacía [duplicate]

7 minutos de lectura

No es un problema importante, pero me preguntaba si hay una forma más limpia de hacerlo. Sería bueno evitar anidar mi código con una instrucción if innecesaria. Si $items está vacío php arroja un error.

$items = array('a','b','c');

if(!empty($items)) { // <-Remove this if statement
  foreach($items as $item) {
    print $item;
  }
}

Probablemente podría usar el supresor de errores ‘@’, pero eso sería un poco complicado.

  • ¿Qué? Si solo comentas el if tienes allí, y cambia la primera línea a $items = array();, funciona perfectamente bien y opera lógicamente. Debe haber más en tu pregunta. Es $items tal vez no una matriz?

    – extraño

    10 de agosto de 2010 a las 6:26

  • Supongo que es en caso de que regrese de la función que también puede devolver falso. También tengo un problema similar y siempre compruebo usando is_array

    – Kool Kabin

    10 de agosto de 2010 a las 6:34

  • FYI – “foreach no admite la capacidad de suprimir mensajes de error usando ‘@’.` – php.net/manual/en/control-structures.foreach.php – entonces, no, no podrías usar @

    -Peter Ajtai

    10 de agosto de 2010 a las 7:42

  • +1 por extraño. Si $items es realmente una matriz, php no le dará un error o una advertencia. Verifique sus ramas if/else y asegúrese de inicializar la variable como una matriz.

    – csonuryilmaz

    25 de febrero de 2013 a las 4:05

  • puede encontrar esta situación con datos que provienen de una función que no es de confianza. Ese caso, un si no es innecesario y puede ser incluso mejor/más limpio que otras soluciones que podrían ser más crípticas y difíciles de leer.

    – Alejandro Moreno

    06/10/2014 a las 15:49

avatar de usuario
cristiano

Hay un millón de formas de hacer esto.

La primera sería seguir adelante y ejecutar la matriz a través de foreach de todos modos, suponiendo que tenga una matriz.

En otros casos, esto es lo que podría necesitar:

foreach ((array) $items as $item) {
    print $item;
}

Nota: a todas las personas que se quejan del encasillamiento, tenga en cuenta que el OP preguntó la forma más limpia de omitir un foreach si la matriz es vacío (el subrayado es mío). Un valor de verdadero, falso, números o cadenas es no se considera vacío. Además, esto funcionaría con objetos que implementen \Traversablemientras is_array no funcionaría

  • Justo lo que quería. Si la variable no es una matriz, el bucle no se ejecutará. Gracias.

    – Benbob

    13 de agosto de 2010 a las 3:53

  • @Keyo lo haría. y arrojará un error cuando $ elementos no definidos

    – Tu sentido común

    3 de octubre de 2011 a las 11:51

  • @Keyo hizo una edición, describiendo lo que significa YCS. Simplemente no lo hagas en general;)

    – nico gawenda

    4 de julio de 2013 a las 3:32

  • Aviso, cuando $elementos es falso.(matriz)$elementos obtendrá matriz(falso)

    – usuario890973

    25 de julio de 2013 a las 6:29

  • No recibí un error cuando $elementos no definidos. ¿Esto es solo para la versión anterior? ¿Pueden las nuevas versiones de PHP solucionar esta situación?

    – Binod Kalathil

    11 de abril de 2014 a las 14:48

avatar de usuario
Tu sentido común

La mejor manera es inicializa cada maldita variable antes de usar.
No solo resolverá este “problema” tonto, sino que también le ahorrará un montón de real dolores de cabeza

Entonces, introduciendo $items como $items = array(); es lo que tu De Verdad querido.

  • No si se inicializa desde una función/método. $items = get_stuff(). Es más fácil simplemente lanzar y las variables falsas devuelven una matriz vacía.

    – Benbob

    4 oct 2011 a las 22:41

  • get_stuff() puede provenir de una API externa. No es raro que las funciones de la biblioteca regresen Array|NULL

    – Frederic Bolduc

    09/04/2016 a las 17:40


  • Incluso las propias funciones de php devuelven diferentes tipos. Suponga que solicita una matriz JSON a través de la red. Sabes que el JSON producido es siempre una matriz. ¿Entonces json_decode() siempre devolverá una matriz? No. Puede ocurrir un tiempo de espera de la red, el JSON recibido estará incompleto y json_decode devolverá NULL. Esto no es inventado, es un ejemplo de la vida real tomado de un error reciente en piwik, un script de análisis popular: github.com/piwik/piwik/pull/11098 Según su respuesta, ¿la solución habría sido cambiar el json_decode () de php?

    – Christopher K.

    17 de enero de 2017 a las 13:57

  • @YourCommonSense, ¿dónde está su respuesta haciendo alguna validación? Validar significaría, por ejemplo, comprobar si lo que json_decode() devolvió es una matriz, que es exactamente lo que dice la respuesta de Matt Williamson.

    – Christopher K.

    17 de enero de 2017 a las 14:13

  • @YourCommonSense La solución que describe es, por supuesto, correcta. Pero su respuesta original no menciona eso y cómo validar la entrada. Incluso podría llevar a algunas personas a suposiciones falsas, como pensar que esto es seguro solo porque se usó la inicialización: $items=array(); $elementos=json_decode($str); foreach ($elementos como $elemento)…

    – Christopher K.

    17 de enero de 2017 a las 14:28

avatar de usuario
matt williamson

$items = array('a','b','c');

if(is_array($items)) {
  foreach($items as $item) {
    print $item;
  }
}

  • Esto no elimina ninguna línea, pero el código es mucho más autodocumentado y más fácil de leer.

    -Peter Ajtai

    10 de agosto de 2010 a las 7:29

  • +1 de esta manera si $items es una matriz pero está vacía, el foreach no se ejecutará y no habrá ningún error. pero vacío () no garantiza si $ elementos es una matriz, por lo que es posible un error

    – Serguéi Eremin

    10 de agosto de 2010 a las 8:49

Si la variable que necesita podría ser boolean false – p.ej. cuando no se devuelven registros de la base de datos o arraycuando se devuelven los registrospuedes hacer lo siguiente:

foreach (($result ? $result : array()) as $item)
    echo $item;

Aproximación con yeso((Array)$result) produce una matriz de conteo 1 cuando la variable es boolean false que no es lo que probablemente quieras.

avatar de usuario
Zach Rattner

No recomendaría suprimir la salida de advertencia. Sin embargo, recomendaría usar is_array en vez de !empty. Si $items resulta ser un escalar distinto de cero, entonces el foreach todavía saldrá un error si usa !empty.

  • +1 suprimir advertencias y errores es nunca una buena idea.

    – cristiano

    10 de agosto de 2010 a las 7:16


  • Odio el is_[array] función, esto suena como una mala programación todavía. Déjame explicarte por qué: ¿Por qué preguntar que una variable es una matriz? Debe saber que es una matriz; de lo contrario, significa que está jugando con el tipo de variable. Si su tipo se vuelve inconsistente, está buscando problemas. Cuando comienza a usar la función is_*, tiende a extenderse por todo su código. Y después de todo, nunca se sabe si is_* es necesario y si el código no se puede leer. Le sugiero que arregle el origen de la inconsistencia de tipo en su lugar.

    – matemáticas

    11 de agosto de 2010 a las 9:42

  • @mathk Probablemente vengas de un lenguaje fuertemente tipado. La variable PHP puede almacenar cualquier cosa, es por eso que is_array, is_numeric, etc. son funciones necesarias.

    –Daniel Wu

    22 de noviembre de 2019 a las 5:41

avatar de usuario
Vladislav Rastrusni

Creo que el mejor enfoque aquí es planificar su código para que $items sea siempre una matriz. La solución más sencilla es inicializarlo en la parte superior de su código con $items=array(). De esta manera, representará una matriz vacía incluso si no le asigna ningún valor.

Todas las demás soluciones son trucos bastante sucios para mí.

  • +1 suprimir advertencias y errores es nunca una buena idea.

    – cristiano

    10 de agosto de 2010 a las 7:16


  • Odio el is_[array] función, esto suena como una mala programación todavía. Déjame explicarte por qué: ¿Por qué preguntar que una variable es una matriz? Debe saber que es una matriz; de lo contrario, significa que está jugando con el tipo de variable. Si su tipo se vuelve inconsistente, está buscando problemas. Cuando comienza a usar la función is_*, tiende a extenderse por todo su código. Y después de todo, nunca se sabe si is_* es necesario y si el código no se puede leer. Le sugiero que arregle el origen de la inconsistencia de tipo en su lugar.

    – matemáticas

    11 de agosto de 2010 a las 9:42

  • @mathk Probablemente vengas de un lenguaje fuertemente tipado. La variable PHP puede almacenar cualquier cosa, es por eso que is_array, is_numeric, etc. son funciones necesarias.

    –Daniel Wu

    22 de noviembre de 2019 a las 5:41

avatar de usuario
Pedro Ajtai

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad