2010-07-12 18 views
44

Estoy escribiendo un foreach que no comienza en el índice 0, sino que se inicia en el primer índice de mi matriz. ¿Hay alguna manera de compensar el punto de partida del bucle?Cómo iniciar un ciclo foreach en un índice específico en PHP

+12

No sería mejor si se utiliza PARA lugar? – Prix

+3

Manejar los pares clave-valor es mucho más fácil en un ciclo foreach y supongo que esa es la razón por la que quería tomar un foreach. O incluso tiene un foreach y no quiere cambiar una gran cantidad de código. – 2ndkauboy

Respuesta

2

En un foreach no puedes hacer eso. Sólo hay dos maneras de conseguir lo que quiere:

  1. utilizar un bucle y empezar en la posición 1
  2. utilizar un foreach y utilizar un algo así como si ($ tecla> 0) alrededor de su código real

Un foreach hace lo que su nombre te está diciendo. Hacer algo para cada elemento :)

EDITAR: OK, una solución muy mal llegó justo a mi mente. Intente lo siguiente:

foreach(array_reverse(array_pop(array_reverse($array))) as $key => $value){ 
    ... 
} 

Eso invertiría la matriz, saltará el último elemento y lo revertirá nuevamente. Entonces tendrás un elemento que excluye el primero.

Pero yo recomendaría utilizar una de las otras soluciones. Lo mejor sería el primero.

y una variación: Puede utilizar array_slice() para que:

foreach(array_slice($array, 1, null, true) as $key => $value){ 
    ... 
} 

embargo, usted debe utilizar los tres parámetros para mantener las claves de la matriz en el bucle foreach:

+0

usando array_slice es posible hacer esto en un bucle foreach, pero esa práctica debe ser altamente desaconsejada y castigada por tener que leer ese tipo de código. – Kris

+0

Es por eso que señalé que es un método MALO para hacer eso. Pero no usaría ninguna de las solutoínas personalmente. Yo usaría una instrucción if o un ciclo for. – 2ndkauboy

13

Usted puede utilizar la función array_slice:

$arr = array(); // your array 
foreach(array_slice($arr, 1) as $foo){ 
    // do what ever you want here 
} 

Por supuesto, se puede usar cualquier valor de desplazamiento que desee. En este caso, 1 'omita' el primer elemento de la matriz.

+0

No vale la pena que esto requiera hacer una copia de ese pedazo de la matriz. Podría ser algo malo si la matriz es grande. –

+0

Tienes razón ... esto funcionará mejor para arreglos cortos. Gracias por tu comentario. – Cristian

1

parece un bucle for sería el mejor camino a seguir aquí, pero si usted piensa que usted debe usar foreach que podría cambiar el primer elemento de la matriz y cancelará el cambio de nuevo en:

$a = array('foo','bar'); 
$temp = array_shift($a); 
foreach ($a as $k => $v) { 
    //do something 
} 
array_unshift($a, $temp); 
+0

Solo señalando que la sintaxis '$ k => $ v' es solo para matrices asociativas. Para las matrices indexadas, solo quieres '$ a as $ v'. –

+0

@Michael: el $ k => $ v también funcionará para la matriz indexada y devolverá el número de índice del valor actual. – 2ndkauboy

+0

¡Oh ... genial! : D lol –

67

Manténgalo sencillo.

foreach ($arr as $k => $v) { 
    if ($k < 1) continue; 
    // your code here. 
} 
+1

Me gusta esa solución. ¿Continúa disponible con cada versión de PHP? – 2ndkauboy

+1

http://ie2.php.net/manual/en/control-structures.continue.php no menciona cuándo estuvo disponible, así que supongo que ha estado allí desde el principio. – TRiG

+1

y, si la matriz no está indexada? – Cristian

27

Un Foreach se restablecerá la matriz:

Nota: Cuando foreach comienza su primera ejecución, el puntero interno se restablece automáticamente al primer elemento de la matriz. Esto significa que no necesita llamar a reset() antes de un ciclo foreach.

utilizar un bucle for (sólo si esto es no una matriz asociativa)

$letters = range('a','z'); 
for($offset=1; $offset < count($letters); $offset++) { 
    echo $letters[$offset]; 
} 

o un bucle while (puede ser cualquier matriz)

$letters = range('a','z'); 
next($letters); 
while($letter = each($letters)) { 
    echo $letter['value']; 
} 

o con una LimitIterator

$letters = new LimitIterator(new ArrayIterator(range('a','z')), 1); 
foreach($letters as $letter) { 
    echo $letter; 
} 

que le permite especificar el desplazamiento de inicio y contar a través del constructor.

toda la producción voluntad por encima de las letras a, b para z en lugar de A a Z

0

Bien ningún cuerpo dijo, pero si no te importa la alteración de la matriz y si queremos empezar desde el segundo elemento de la matriz dada:

unset($array[key($array)]); 
foreach($array as $key=>$value) 
{ 
    //do whatever 
} 

si lo hace la mente, sólo tiene que añadir,

$saved = $array; 
unset($array[key($array)]); 
foreach($array as $key=>$value) 
{ 
    //do whatever 
} 
$array = $saved; 

Por otra parte, si desea omitir un índice conocido dado, simplemente subtitute

key($array) 

por el índice dado

Cuestiones relacionadas