2011-05-01 16 views
7

Ecco qualcosa di semplice per qualcuno che risponda per me. Ho provato a cercare ma non so cosa sto cercando davvero.Come selezionare solo i primi elementi di un array?

Ho una matrice da una stringa JSON, in PHP, di membri del cast e della troupe per un film.

Qui sto tirando fuori solo le persone con il nome del processo 'Attore'

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>'; 
     } 
    } 

Il problema è, mi piacerebbe essere in grado di limitare il numero di persone con il nome del processo 'Attore' sono tirati su. Dire, il primo 3.

Quindi, come sceglierei solo i primi 3 di questi utenti da questo array?

+0

Un'altra opzione per quelli sotto è quella di aggiungere un contatore nel ciclo –

risposta

3

Utilizzare una variabile chiamata $num_actors per monitorare il numero che hai già contato, e break fuori dal giro una volta arrivati ​​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

Grazie a tutti per l'aiuto. Ho scelto questo qui però perché sembrava popolare e ha funzionato per me. – Rowan

1

Aggiungere un contatore e un'istruzione 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 addirittura

$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 - questo io s un po 'di over-kill per questo problema, ma forse serve alcuni scopi educativi. PHP viene fornito con un insieme di iteratori che possono essere utilizzati per astrarre l'iterazione su un determinato insieme di elementi.

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 /*... */; 
} 

estendendo la classe astratta FilterIterator siamo in grado di definire un filtro che restituisce solo gli attori dalla lista fornita. LimitIterator consente di limitare l'iterazione a un determinato set e lo ArrayIterator è un semplice helper per rendere gli array nativi compatibili con l'interfaccia Iterator. Gli iteratori consentono allo sviluppatore di costruire catene che definiscono il processo di iterazione che li rende estremamente flessibili e potenti.

Come ho detto nell'introduzione: il problema dato può essere risolto facilmente senza questa roba di Iterator, ma fornisce allo sviluppatore alcune opzioni estese e consente il riutilizzo del codice. Ad esempio, è possibile migliorare ActorIterator in CastIterator che consente di passare il tipo di cast al filtro nel costruttore.

+0

+1 molto bello :) – kapa

Problemi correlati