来自groovy,列表上有.find()和.findAll()方法....
array_filter()似乎PHP等同于groovy findAll。
//groovy
def allScorersOverFivePoints=scorers.findAll{
it.points > 5
}
//PHP
$allScorersOverFivePoints=array_filter($scorers,function($item){
return $item->points >5 } )
array_reduce()只能返回一个值或null(如find()),但它仍然会遍历整个数组。
//groovy
def firstScorerOverZero=scorers.find{
it.points > 0;
}
//PHP- without manually looping will always go through the whole array??
$firstScorerOverZero=array_reduce($scorers, function($carry,$item){
if($item->points > 0 && !isset($carry){
$carry=$item;
return $carry;
} ) }
, null)
有没有办法打破这些功能循环,或者我需要手动执行此操作......
$firstScorerOverZero=null;
$len=count($scorers);
$i=0;
while($i++<$len){
if($scorers[$i]->points >0){
$firstScorerOverZero=$scorers[$i];
break;
}
}
答案 0 :(得分:2)
不,没有办法打破内置array_filter
和array_reduce
函数的内部循环。如果您的代码执行此操作很重要,您将需要创建自己的循环来模拟其中一个函数的行为(同时添加中断),或者使用提供注释中建议的行为的框架。当然,您需要验证框架是否以您需要的方式实际实现了这些功能。
就性能而言,假设不在整个数组上迭代的代码会更快,这是有意义的,但如果您使用的数组不是很大,这可能是微优化。
如果您确实想要这样做,您展示的循环可以使用foreach
代替while
更简单地编写 。
$firstScorerOverZero = null;
foreach ($scorers as $scorer) {
if ($scorer->points > 0) {
$firstScorerOverZero = $scorer->points;
break;
}
}
答案 1 :(得分:2)
我最近在全局帮助函数中定义了以下函数
function array_reduce_break(array $array, callable $callback, $initial = null, array $break_values = [])
{
$result = $initial;
foreach($array as $key=>$value)
{
$result = $callback($result,$value,$key);
if(in_array($result,$break_values))
{
break;
}
}
return $result;
}