【问题标题】:Quickest way to evaluate contents of object array [duplicate]评估对象数组内容的最快方法[重复]
【发布时间】:2020-03-24 14:41:12
【问题描述】:

假设我有一个对象数组。

我想看看是否有任何对象具有foo 的名称属性。

在 C# 等其他语言中,有一种简单的评估方法:

objArray.Contains(x => x.Name == "foo");

在 PHP 中是否有比这更好的方法:

$hasFoo = false;
foreach($objs as $obj)
{
    if($obj->name == "foo")
    {
        $hasFoo = true;
        break;
    }
}

【问题讨论】:

  • 这是最有效的方法。您可以使用 array_reduce 之类的东西,但没有一个 PHP 数组函数有打破循环的方法,因此即使在第一个元素中找到匹配项,它们也会处理整个数组。
  • link 复制
  • 你可以使用这个答案:stackoverflow.com/a/26524231/283322

标签: php


【解决方案1】:

不是更好,但您可以过滤并检查是否为空或使用 (bool) 转换为布尔值:

$hasFoo = array_filter($objs, funtion($v) { return $v->name === ‘foo’; });


$hasFoo = (bool)array_filter($objs, funtion($v) { return $v->name === ‘foo’; });

【讨论】:

    【解决方案2】:

    没有(从 PHP 7.3 开始)。

    您可以使用array_reduce() 使用更清晰但效率较低的语法:

    function satisfies(array $objectArray, $callback) {
        return array_reduce(
            $objectArray,
            function($found, $item) use ($callback) {
                return $found || call_user_func($callback, $item);
            },
            false
        );
    }
    
    
    $has = satisfies($array, function($obj) { return $obj->name === 'foo'; });
    

    该函数将迭代地调用回调,直到它返回true,然后它将继续遍历整个数组(尽管速度相当快)。如果数组中没有元素返回真值,则函数返回false

    在每次迭代时发出调用并传递一个对象,该函数比普通的foreach 慢。

    而且,正如@Jeto 非常正确地指出的那样,我对它进行了过度设计。本来可以写

    function satisfies(array $objectArray, $callback, $ifFound = true, $ifNotFound = false) {
        foreach ($objectArray as $obj) {
            if (call_user_func($callback, $obj)) {
                return $ifFound;
            }
        }
        return $ifNotFound;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 2016-05-17
    • 2020-07-01
    • 2012-10-03
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多