2010-08-10 8 views
96

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

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

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

Probablemente podría simplemente usar el '@' supresor de errores, pero sería un poco hacky.

+10

¿Qué? Si solo comenta el 'si' tiene allí, y cambia la primera línea a' $ items = array(); ', funciona perfectamente y funciona lógicamente. Debe haber más en tu pregunta. ¿'$ Items' no es una matriz? – strager

+1

Supongo que es en caso de que el retorno de la función que puede devolver también falso. También tengo un problema similar y siempre controlo usando is_array – KoolKabin

+2

FYI - '' foreach no admite la capacidad de suprimir mensajes de error usando '@'. '- http://php.net/manual/en/control-structures.foreach .php - entonces, no, no podría usar '@' –

Respuesta

167

Hay un millón de formas de hacerlo.

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

En otros casos se trata de lo que pueda necesitar:

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

Nota: a todas las personas que se quejan de encasillado, tenga en cuenta que el PO pidió forma más limpia de saltarse un foreach si el array es vacío (el énfasis es mío). Un valor de verdadero, falso, números o cadenas es no se considera vacío.

+1

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

+4

@Keyo lo haría. y lanzará un error cuando $ items undefined –

+0

@Keyo haga una edición, describiendo qué significa YCS. Simplemente no lo haga generalmente;) –

14

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

+8

+1 supresión de advertencias y errores es ** nunca ** una buena idea. – Christian

+3

Sigo con la función is_ [array], esto suena como una programación pobre todavía. Déjame explicar por qué: ¿Por qué preguntarle a 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 empiezas a usar la función is_ * tiende a extenderse por todo tu código. Y, después de todo, nunca se sabe si is_ * es necesario y su código no se puede leer. Le sugiero que solucione el origen de la incoherencia de tipo en su lugar. – mathk

4
foreach((array)$items as $item) {} 
24
$items = array('a','b','c'); 

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

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

+5

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

+1

Nota rápida de que este ejemplo tiene demasiados paréntesis de cierre ')' en la declaración 'if' – Berto

6

Creo que el mejor enfoque aquí es planificar su código para que $ items sea siempre una matriz. La solución más fácil es inicializarla 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 bastante sucias para mí.

+0

+1 para "siempre una matriz" – mathk

+0

Lamentablemente, esto no funciona; PHP genera este error incluso cuando es una matriz debidamente vacía. No puede distinguir en tiempo de ejecución. –

+0

@Chris Arguin ¿Por qué? Por favor, publique un ejemplo aquí. No debería arrojar errores en la matriz. –

2

que tengo la siguiente función en mi "biblioteca estándar"

/// Convert argument to an array. 
function a($a = null) { 
    if(is_null($a)) 
     return array(); 
    if(is_array($a)) 
     return $a; 
    if(is_object($a)) 
     return (array) $a; 
    return $_ = func_get_args(); 
} 

Básicamente, esto no hace nada con matrices/objetos y convertirlos en otros tipos de matrices. Esto es extremadamente útil para usar con las declaraciones foreach y funciones de matriz

foreach(a($whatever) as $item).... 

    $foo = array_map(a($array_or_string).... 

    etc 
+0

suena como un gran hack feo. – mathk

+0

porque es mejor que preguntes por qué en primer lugar obtuviste un nulo u objeto en lugar de una matriz. Estás asumiendo que el tipo es inconsistente. Y extiendes la prueba por todo tu código. Esa es una especie de programación defensiva. – mathk

22

La mejor forma de hacerlo es inicializar todas las variables sangrienta antes de su uso.
No solo resolverá este tonto "problema" sino que también le ahorrará una tonelada de dolores de cabeza reales.

Por lo tanto, la introducción de $ artículos como $items = array(); es lo que realmente quería.

+3

No si se inicializa desde una función/método. '$ items = get_stuff()'. Es más fácil simplemente arrojar y falsas variables devolver una matriz vacía. – Keyo

+10

haz que tu get_stuff() devuelva una matriz vacía, –

+6

tonto 'get_stuff()' puede provenir de una API externa. No es raro que las funciones de la biblioteca devuelvan 'Array | NULL' –

1

La lógica ternaria lo lleva a una línea sin errores. Esto resuelve el problema de las variables indebidamente emitidas y las variables indefinidas.

foreach (is_array($Items) || is_object($Items) ? $Items : array() as $Item) { 

Escribir un comentario es un poco difícil, pero es la manera más segura de manejarlo.

0

La mejor práctica es definir la variable como una matriz en la parte superior de su código.

foreach ((array) $ myArr como $ oneItem) {..}

también funcionará pero se duplicará esto cada vez (array) de conversión que necesita para recorrer la matriz.

dado que es importante no duplicar ni siquiera una palabra de tu código, será mejor que lo definas como una matriz vacía en la parte superior.

+0

Esto no es verdad. El encasillado solo se realiza una vez. Además, las variables de PHP no se escriben - una variable puede cambiar su tipo en cualquier momento. – Christian

0

Puede comprobar si $ artículos es en realidad una matriz y si contiene ningún artículo en:

if(is_array($items) && count($items) > 0) 
{ 
    foreach($items as $item) { } 
} 
9

Si la variable que necesita podría ser boolean false - por ejemplo. cuando no hay registros se devuelven desde la base de datos o array - cuando los registros se devuelven, puede hacer lo siguiente:

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

enfoque con el molde ((Array)$result) produce una serie de recuento 1 cuando la variable es boolean false, que ISN' t lo que probablemente quieras

+0

Esto producirá un error de sintaxis al asignar por referencia, como en "foreach ... as & $ item", porque cuando $ result es nulo, no puede asignar una referencia a "array()". Ver: http://php.net/manual/es/control-structures.foreach.php –

+0

Sí, buen punto. Sin embargo, todavía es útil en casos más simples. –

Cuestiones relacionadas