如何仅挑选数组中的前几项?

问题描述:

这里有人为我回答简单的东西。我尝试过搜索,但我不知道我在找什么。如何仅挑选数组中的前几项?

我有一个来自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

$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

添加计数器和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; 
    } 
} 

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

$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; 
}); 

行 - 这个我对这个问题有点过分杀手,但也许它有一些教育目的。 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