评估对象数组内容的最快方法

可以说我有一个对象数组。


我想看看是否有任何对象具有 name 属性foo。


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


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

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


$hasFoo = false;

foreach($objs as $obj)

{

    if($obj->name == "foo")

    {

        $hasFoo = true;

        break;

    }

}


湖上湖
浏览 88回答 2
2回答

森栏

不是更好,但您可以过滤并检查是否为空或使用 (bool) 转换为布尔值:$hasFoo = array_filter($objs, funtion($v) { return $v->name === ‘foo’; });$hasFoo = (bool)array_filter($objs, funtion($v) { return $v->name === ‘foo’; });

一只斗牛犬

没有(从 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;}
打开App,查看更多内容
随时随地看视频慕课网APP