如何仅选择阵列中的前几项?

时间:2011-05-01 23:54:33

标签: php arrays

这对某些人来说很简单。我试过搜索,但我不知道我在寻找什么。

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

问题是,我希望能够限制有多少人将工作名称“Actor”拉出来。说,第3个。

那么我如何从这个阵列中只挑选这些人中的前三个呢?

5 个答案:

答案 0 :(得分: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,我们能够定义一个只返回给定列表中的actor的过滤器。 LimitIterator允许您将迭代限制为给定集合,ArrayIterator是一个简单的帮助程序,可使本机数组与Iterator接口兼容。迭代器允许开发人员构建定义迭代过程的链,这使得它们非常灵活和强大。

正如我在介绍中所说:没有这个Iterator的东西,给定的问题可以轻松解决,但它为开发人员提供了一些扩展选项并支持代码重用。例如,您可以将ActorIterator增强为某些CastIterator,允许您在构造函数中传递强制类型以进行过滤。

答案 1 :(得分:3)

使用名为$num_actors的变量来跟踪已经计算的数量,并在达到3后使用break离开循环。

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

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

答案 2 :(得分:3)

$actors=array_filter($movies[0]->cast, function ($v) {
    return $v->job == 'Actor';
});

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

甚至

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

答案 3 :(得分: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;
  }
}

答案 4 :(得分: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>';
      }
  }