代码之家  ›  专栏  ›  技术社区  ›  Guerrilla

计算对象数组内容的最快方法

php
  •  0
  • Guerrilla  · 技术社区  · 6 年前

    假设我有一个对象数组。

    我想看看这些对象中是否有name属性 foo .

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

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

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

    $hasFoo = false;
    foreach($objs as $obj)
    {
        if($obj->name == "foo")
        {
            $hasFoo = true;
            break;
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   AbraCadaver    6 年前

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

    $hasFoo = array_filter($objs, funtion($v) { return $v->name === ‘foo’; });
    
    
    $hasFoo = (bool)array_filter($objs, funtion($v) { return $v->name === ‘foo’; });
    
        2
  •  1
  •   LSerni    6 年前

    没有(从PHP7.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 然后 它将继续在整个阵列中行走 (尽管速度相当快)。如果数组中没有元素返回truthy值,则函数返回 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;
    }
    
    推荐文章