2009-04-24 15 views
6

quiero hacer algo como esto:¿Cuál es la forma más elegante de hacer "foreach x except y" en PHP?

foreach ($array as $key=>$value except when $key="id") 
{ 
// whatever 

} 

... sin tener que poner una cláusula "si" en el interior del cuerpo del bucle. No se garantiza que "id" sea el primer o el último elemento de la matriz, y realmente no quiero desarmar ni cortar la matriz, porque será caro, feo y no mantendrá los datos originales. Definitivamente también necesito usar tanto la clave como el valor dentro del ciclo.

¿Alguna idea?

Respuesta

14

No creo que la cláusula si es un problema de este tipo:

foreach ($array as $key => $value) { 
    if ($key == 'ignore_me') continue; 
    if ($key == 'ignore_me_2') continue; 

Si desea una solución elegante, puede utilizar array_diff_key:

$loop_array = array_diff_key($actual_array, array('ignore_me' => NULL, 'ignore_me_2' => NULL)); 
foreach ($loop_array as $key => $value) { 
    #... 
+1

que debería funcionar, pero requiere una pila de más memoria porque crea otra copia de la matriz. – Alnitak

+0

parece costoso ... – Thilo

+0

Sí, es respuesta alterada para reflejar eso. – soulmerge

2

Creo que siempre terminará usando una cláusula IF en el bucle interno. De todas las opciones que ya dio, esa es la única que usaría para la velocidad y el consumo de memoria

1

AFAIK no puede hacerlo sin un if en el ciclo.

Al igual que la palabra clave dice, es "para cada uno", no "para la mayoría".

EDIT: soulmerge como dice, usted podría hacerlo con array_diff_key(), pero si sólo se está perdiendo una sola tecla es más detallado y menos eficiente de la memoria de sólo poner el if en el bucle.

5

Ir a la si- cláusula dentro del bucle. No hay nada de poco elegante al respecto, es el más fácil de leer y comprender, y es el más eficiente.

Si tiene muchas teclas para saltar se podría construir un segundo hash para probar en contra (en la cláusula if):

foreach ($array as $key => $value) { 
    if (array_key_exists($key,$skip_keys)) continue; 
    ... 
} 
0

Otra forma de compactar la declaración if es:

// ignore 1,5,8,9 
foreach($arr as $key){ 
    if(in_array($key, array(1,5,8,9)) continue; 
    ... 
} 
Cuestiones relacionadas