这对某些人来说很简单。我试过搜索,但我不知道我在寻找什么。
我有一个来自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个。
那么我如何从这个阵列中只挑选这些人中的前三个呢?
答案 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>';
}
}