php
  • arrays
  • 2011-05-01 20 views 7 likes 
    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

    下面的其他選項是在循環中添加一個計數器 – 2011-05-02 00:08:40

    回答

    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

    感謝大家的幫助。我在這裏選擇了這個,不過因爲它看起來很受歡迎而且對我很有用。 – Rowan 2011-05-02 02:04:00

    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

    行 - 這個我對這個問題有點過分殺手,但也許它有一些教育目的。 PHP帶有一組迭代器,可用於抽象對給定項目集的迭代。

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

    通過擴展抽象類FilterIterator我們能夠定義一個過濾器,只返回從給定列表中的演員。 LimitIterator允許您將迭代限制爲給定集合,並且ArrayIterator是使本地陣列與Iterator接口兼容的簡單助手。迭代器允許開發人員構建定義迭代過程的鏈,這使得它們非常靈活和強大。

    正如我在介紹中所說的:如果沒有這個Iterator的東西,給定的問題可以很容易地解決,但它爲開發人員提供了一些擴展選項並支持代碼重用。例如,您可以將ActorIterator增強爲CastIterator,這允許您在構造函數中傳遞類型以進行過濾。

    +0

    +1非常好的一個:) – kapa 2011-05-02 07:09:57

    相關問題