2010-01-04 19 views
9

Tengo un bucle foreach que necesito limitar a los primeros 10 elementos y luego salir de él.limitando el número de veces que se ejecuta un ciclo en php

¿Cómo haré eso aquí?

foreach ($butters->users->user as $user) { 
    $id = $user->id; 
    $name = $user->screen_name; 
    $profimg = $user->profile_image_url; 
    echo "things";  
} 

Agradeceríamos una explicación detallada también.

Respuesta

36

Si desea utilizar foreach, puede agregar una variable adicional para controlar el número de iteraciones. Por ejemplo:

$i=0; 
foreach ($butters->users->user as $user) { 
    if($i==10) break; 
    $id = $user->id; 
    $name = $user->screen_name; 
    $profimg = $user->profile_image_url; 
    echo "things"; 
    $i++; 
} 
+2

Debería ser si ($ i == 10) y no = 10. –

+0

Olvidó un '=' en '$ i = 10'. – Gumbo

+1

Gracias por la corrección. – Alex

2

Utilice un contador de bucle y break cuando desee salir.

$i = 0; 
foreach ($butters->users->user as $user) { 
    $id = $user->id; 
    $name = $user->screen_name; 
    $profimg = $user->profile_image_url; 
    echo "things";  
    if (++$i >= 10) { 
    break; 
    } 
} 

En la décima iteración, el ciclo saldrá al final.

Existen varias variaciones de esto y una cosa que debe elegir es si desea ejecutar la condición de bucle externo o no. Considere:

foreach (read_from_db() as $row) { 
    ... 
} 

Si sale en la parte superior de ese ciclo, habrá leído 11 filas. Si sale de la parte inferior, será 10. En ambos casos, el cuerpo del ciclo se ejecutó 10 veces, pero la ejecución de esa función extra podría ser lo que usted desea o no.

+0

errata allí, debería ser '($ i ++> 10)' –

+0

Esto romperá el bucle 'foreach' con la primera iteración. – Gumbo

1

Si está seguro de querer mantener el bucle foreach, añadir un contador:

$count = 0; 
foreach ($butters->users->user as $user) { 
    $id = $user->id; 
    $name = $user->screen_name; 
    $profimg = $user->profile_image_url; 
    echo "things";  

    $count++; 
    if ($count == 10) 
     break; 
} 

por lo que cada vez que el bucle se ejecuta, el contador se incrementa y cuando llega a 10 , el bucle está roto.

Como alternativa, puede volver a trabajar el bucle foreach para que sea un bucle for, si es posible.

1

se puede iniciar un mostrador antes de su bloque foreach y comprobar su contra en el bucle y romperse si el contador es de 10 como tal,

$count = 1; 
foreach ($butters->users->user as $user) { 
    if($count == 10) 
     break; 
    $id = $user->id; 
    $name = $user->screen_name; 
    $profimg = $user->profile_image_url; 
    echo "things"; 
    $count++; 
} 
15

También puede utilizar el LimitIterator.

p. Ej.

$users = new ArrayIterator(range(1, 100)); // 100 test records 
foreach(new LimitIterator($users, 0, 10) as $u) { 
    echo $u, "\n"; 
} 
3

Simplemente podría iterar sobre array_slice($butters->users->user, 0, 10) (los primeros 10 elementos).

0

Me gusta mucho la respuesta de VolkerK, pero no entiendo por qué está creando un nuevo iterador cuando lo más probable es que tenga una matriz existente. Solo quiero compartir la forma en que terminé haciéndolo.

$arrayobject = new ArrayObject($existingArray); 
$iterator = $arrayobject->getIterator(); 

foreach(new LimitIterator($iterator, 0, 10) as $key => $value) { 
    // do something 
} 
Cuestiones relacionadas