2011-05-01 4 views
7

誰かが私のために簡単に答えてくれます。私は検索しようとしましたが、私は本当に何を探しているのかわかりません。アレイ内の最初の数アイテムだけを選択するにはどうすればよいですか?

私はPHPのJSON文字列から、ムービーのキャストメンバーを配列しています。ここで

私はこの問題は、私が仕事名「俳優」でどのように多くの人を制限できるようにしたいです

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

が引っ張られる

ジョブ名「俳優」でのみ、人々を引き出していますでる。最初の3つを言ってください。

この配列からこれらの人のうち最初の3人だけをどうやって選びますか?

+0

以下のオプションの別のオプションは、ループ内にカウンタを追加することです。 –

答えて

3

あなたは3

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

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

皆様のおかげで助けていただきました。私はここでこの1つを選んだが、それは普及していると私のために働いたので。 – Rowan

1

カウンタと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); 

あるいは

に得ればあなたは既に数えてきたどのように多くの追跡する $num_actorsという変数を使用し、ループの外 break
$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この問題のために少し徹底的に打ちのめされていますが、おそらくそれは何らかの教育目的に役立ちます。 PHPには一連のイテレータが付属しており、指定された一連のアイテムに対して抽象反復処理を行うことができます。抽象クラスFilterIteratorを拡張することにより

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

我々は与えられたリストからのみの俳優を返すフィルタを定義することができます。 LimitIteratorは、反復を指定されたセットに制限することを可能にし、ArrayIteratorは、Iteratorインターフェイスと互換性のあるネイティブ配列を作成する簡単なヘルパーです。イテレータを使用すると、反復プロセスを定義するチェーンを構築し、非常に柔軟で強力なものにすることができます。

序論で述べたように、与えられた問題はこのイテレータのものがなくても簡単に解決できますが、開発者に拡張オプションを提供し、コードを再利用できるようにします。たとえば、ActorIteratorCastIteratorに強化すると、コンストラクタでフィルタリングするキャスト型を渡すことができます。

+0

+1非常にいいです:) – kapa

関連する問題