在循环遍历整个数组之前,PHP会跳出array_reduce

时间:2017-01-18 19:24:53

标签: php

来自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;
          }
 }

2 个答案:

答案 0 :(得分:2)

不,没有办法打破内置array_filterarray_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;
}