2010-05-19 39 views
18

Aquí está el ciclo.¿Cómo puedo detener este ciclo foreach después de 3 iteraciones?

foreach($results->results as $result){ 
    echo '<div id="twitter_status">'; 
    echo '<img src="'.$result->profile_image_url.'" class="twitter_image">'; 
    $text_n = $result->text; 
    echo "<div id='text_twit'>".$text_n."</div>"; 
    echo '<div id="twitter_small">'; 
    echo "<span id='link_user'".'<a href="http://www.twitter.com/'.$result->from_user.'">'.$result->from_user.'</a></span>'; 
    $date = $result->created_at; 

    $dateFormat = new DateIntervalFormat(); 

    $time = strtotime($result->created_at); 

    echo "<div class='time'>"; 

    print sprintf('Submitted %s ago', $dateFormat->getInterval($time)); 

    echo '</div>'; 

    echo "</div>"; 
    echo "</div>"; 
+0

¿Una variable y una condición de contador? –

+2

¿Por qué usarías un foreach cuando sabes exactamente cuántos resultados quieres? Use el estándar for loop (http://php.net/manual/es/control-structures.for.php) – wlangstroth

+1

Un poco fuera de tema, pero lo ideal sería modificar el código de consulta para que solo esté utilizando el cantidad de resultados que necesitas Eso puede o no ser posible con cualquier API de Twitter que estés usando. – meagar

Respuesta

49

Con el comando break.

Aunque le falta un soporte.

$i=0; 
foreach($results->results as $result){ 
//whatever you want to do here 

$i++; 
if($i==3) break; 
} 

Más información sobre el comando break en: http://php.net/manual/en/control-structures.break.php

Actualización: Como Kyle señaló, si quieres romper el bucle que es mejor utilizar for en lugar de foreach. Básicamente, tienes más control del flujo y obtienes legibilidad. Tenga en cuenta que sólo se puede hacer esto si los elementos de la matriz son contigua y indexable (como Colonel Sponsz señaló)

El código sería:

for($i=0;$i<3;$i++){ 
$result = $results->results[i]; 
//whatever you want to do here 
} 

Es más limpio, es más a prueba de errores (las variables de control están todas dentro de la declaración for), y simplemente leyéndolo, sabe cuántas veces se ejecutará. break/continue debe evitarse si es posible.

+1

... o simplemente si (++ $ i == 3) break; –

+1

¡No! No use descansos, solo use un ciclo for. – Kyle

+2

@Manos Dilaverakis: eso funcionaría, sí, pero el objetivo de la respuesta es entender cómo funciona el "descanso", no hacer una optimización ansiosa. – pakore

6
  • declara una variable antes del bucle, inicializar a 0.
  • variable de Incremento en el comienzo de la carrocería por-cada.
  • Verifique la variable al final del cuerpo de cada uno.
    • Si es 3, break.

Usted tiene que tener cuidado con esta técnica porque puede haber otra break/continue en el no-para cada cuerpo, pero en su caso no existe, por lo que este iba a funcionar.

+0

He tenido problemas para intentar esto. Como estoy tratando con un objeto. Tan pronto como coloque una variable en el valor de la clave, iteraré y mi objeto perderá sus claves. Extraño, lo sé. – Tapha

+0

ignórame. ja ja me suponía que no debería estar haciendo eso! – Tapha

1

Incremento algunos contador $i en el beggining del bucle y break; cuando llega a 3, por ejemplo .:

if ($i++ == 3) 
    break; 
+3

Correcto sería 'if ++ i == 3' y * not * incrementando el contador en cualquier parte del ciclo. No es inteligente ni aconsejable usar el operador de incremento de prefijo/postfijo junto con la comparación de valores, ya que conduce exactamente a este tipo de errores desconocidos y completamente evitables. – Tomalak

+0

De acuerdo en el punto de lectura, pero al poner 'if ($ i ++ == 3) break;' al principio del ciclo (como mencioné) * would * work. –

+0

Sí, parece detener el ciclo después de tres iteraciones (de hecho, se ejecuta 4 veces, solo que la cuarta iteración se interrumpe de inmediato), pero también cuenta $ i demasiado temprano y no se pudo ejecutar un ciclo comenzando desde 0 (pruébalo). Di lo que quieras, este enfoque es fundamentalmente defectuoso. (En un ciclo 'foreach', estas implicaciones no importan demasiado, pero es mejor no entrar en este estilo de codificación) – Tomalak

1
foreach($results->results as $i => $result){ 
    if($i==3) break; 
    //whatever you want to do here 
} 
+1

Esto hace una suposición incorrecta sobre el tipo de matriz: se interrumpirá tan pronto como la matriz no utilice claves numéricas que van desde 0..n-1. – Tomalak

+0

@Tomalak Este patrón me resulta bastante seguro con PHP cuando se repiten los resultados de una consulta. En general, tendrá una clara distinción entre si una matriz es una matriz tradicional o una con claves no numéricas o no continuas. – meagar

+0

Sí, si sabes que estás tratando con una matriz numérica "estándar", está bien. – Tomalak

Cuestiones relacionadas