为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
湖上湖 2022-05-27 16:24:49
可以说我有一个对象数组。我想看看是否有任何对象具有 name 属性foo。在 C# 等其他语言中,有一种简单的评估方法,例如:objArray.Contains(x => x.Name == "foo");在 PHP 中有比这更好的方法:$hasFoo = false;foreach($objs as $obj){    if($obj->name == "foo")    {        $hasFoo = true;        break;    }}
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

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


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



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


查看完整回答
反对 回复 2022-05-27
?
一只斗牛犬

TA贡献1784条经验 获得超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;

}


查看完整回答
反对 回复 2022-05-27
  • 2 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信