2011-05-01 13 views
7

Aquí hay algo simple para que alguien responda por mí. Intenté buscar pero no sé lo que estoy buscando realmente.¿Cómo selecciono solo los primeros elementos de una matriz?

Tengo una matriz de una cadena JSON, en PHP, del elenco y miembros del equipo para una película.

Aquí estoy tirando a cabo sólo las personas con el nombre del trabajo 'Actor'

foreach ($movies[0]->cast as $cast) { 
     if ($cast->job == 'Actor') { 
    echo '<p><a href="people.php?id=' . $cast->id . '">' . $cast->name . ' - ' . $cast->character . '</a></p>'; 
     } 
    } 

El problema es, me gustaría ser capaz de limitar el número de personas con el nombre del trabajo 'Actor' se tira fuera. Diga, el primero 3.

Entonces, ¿cómo elegiría solo las primeras 3 de estas personas de esta matriz?

+0

otra opción para los que figuran a continuación es agregar un contador en el bucle –

Respuesta

3

utilizar una variable llamada $num_actors para rastrear la cantidad que ya ha contado, y break fuera del circuito una vez que llegue a 3.

$num_actors = 0; 
foreach ($movies[0]->cast as $cast) { 
    if ($cast->job == 'Actor') { 
     echo '...'; 

     $num_actors += 1; 
     if ($num_actors == 3) 
      break; 
    } 
} 
+0

Gracias a todos por la ayuda. Aunque elegí este porque parecía popular y funcionó para mí. – Rowan

1

Agregue un contador y una instrucción if.

$count = 0; 
foreach ($movies[0]->cast as $cast) 
{ 
    if ($cast->job == 'Actor') 
    { 
    echo '<p><a href="people.php?id=' . $cast->id . '">' . $cast->name . ' - ' . $cast-character . '</a></p>'; 

    if($count++ >= 3) 
     break; 
    } 
} 
1
$limit = 3; 
$count = 0; 

    foreach ($movies[0]->cast as $cast) { 
     // You can move the code up here if all you're getting is Actors 
     if ($cast->job == 'Actor') { 
      if ($count == $limit) break;// stop the loop 
      if ($count == $limit) continue;// OR move to next item in loop 
      $count++; 
      echo '<p><a href="people.php?id=' 
        . $cast->id 
        . '">' 
        . $cast->name 
        . ' - ' 
        . $cast->character 
        . '</a></p>'; 
     } 
    } 
3
$actors=array_filter($movies[0]->cast, function ($v) { 
    return $v->job == 'Actor'; 
}); 

$first3=array_slice($actors, 0, 3); 

o incluso

$limit=3; 
$actors=array_filter($movies[0]->cast, function ($v) use (&$limit) { 
    if ($limit>0 && $v->job == 'Actor') { 
     $limit--; 
     return true; 
    } 
    return false; 
}); 
4

OK - this i Es un poco excesivo para este problema, pero tal vez sirve para algunos propósitos educativos. PHP viene con un conjunto de iteradores que pueden usarse para resumir la iteración sobre un conjunto determinado de elementos.

class ActorIterator extends FilterIterator { 
    public function accept() { 
     return $this->current()->job == 'Actor'; 
    } 
} 

$maxCount = 3; 
$actors = new LimitIterator(
    new ActorIterator(
     new ArrayIterator($movies[0]->cast) 
    ), 
    0, 
    $maxCount 
); 
foreach ($actors as $actor) { 
    echo /*... */; 
} 

Al extender la clase abstracta FilterIterator que son capaces de definir un filtro que sólo devuelve los actores de la lista dada. LimitIterator le permite limitar la iteración a un conjunto determinado y ArrayIterator es un simple ayudante para hacer que las matrices nativas sean compatibles con la interfaz Iterator. Los iteradores permiten al desarrollador crear cadenas que definen el proceso de iteración, lo que los hace extremadamente flexibles y potentes.

Como dije en la introducción: el problema se puede resolver fácilmente sin estas cosas de Iterator, pero proporciona al desarrollador algunas opciones extendidas y permite la reutilización de código. Podría, por ejemplo, mejorar el ActorIterator a unos CastIterator que le permite pasar el tipo de conversión para filtrar en el constructor.

+0

+1 muy agradable :) – kapa

Cuestiones relacionadas