Php,检查对象数组中是否存在具有属性=值的对象

and*_*rew 4 php arrays object

我想我可以用这样的 foreach 循环来做到这一点:

 foreach ($haystack as $item)
       if (isset($item->$needle_field) && $item->$needle_field == $needle)
            return true;
 } 
Run Code Online (Sandbox Code Playgroud)

但我想知道是否可以在没有循环的情况下完成?

就像是:

  if(in_array($item->$needle_field == $needle,$haystack)
            return true;
Run Code Online (Sandbox Code Playgroud)

mic*_*usa 13

是的,在现代 PHP 中,您可以通过结合array_column()(已经发展到也可以处理对象数组)和 的力量来确定特定对象属性是否包含特定值,而无需经典循环in_array()

代码:(演示

$objects = [
    (object)['cats' => 2],
    (object)['dogs' => 2],
    (object)['fish' => 10],
    (object)['birds' => 1],
];

$needleField = 'cats';
$needleValue = 2;

var_export(
    in_array($needleValue, array_column($objects, $needleField))
);
// output: true
Run Code Online (Sandbox Code Playgroud)

这种技术的优点是语法明显简洁。对于相对较小的数据量来说,这是一种完全可以接受的方法。

此技术的一个可能的缺点是,array_column()将生成与 相关的所有值的新数组$needleField

在我上面的演示中,只会生成一个单元素数组,因为所有对象中array_column()只有一个属性。cats如果我们处理的数据量相对较大,那么费心收集所有符合条件的cats值,然后in_array()在只需要返回一个匹配项时运行,效率会很低true

对于性能是脚本设计主要标准的“大量”数据,经典foreach循环将是更好的选择,一旦对象满足规则,就应该通过return或停止循环break

代码:(演示

function hasPropertyValue(array $objects, $property, $value): bool {
    foreach ($objects as $object) {
        if (property_exists($object, $property) && $object->{$property} === $value) {
            return true;
        }
    }
    return false;
}
var_export(
    hasPropertyValue($objects, $needleField, $needleValue)
);
Run Code Online (Sandbox Code Playgroud)