是的,在现代 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
这种技术的优点是明显简洁的语法。对于相对少量的数据,这是一种完全可以接受的方法。
这种技术的一个可能的缺点是,array_column()
它将生成一个包含所有与$needleField
.
在我上面的演示中,array_column()
将只生成一个单元素数组,因为cats
所有对象中只有一个属性。如果我们正在处理相对大量的数据,那么费心收集所有符合条件的cats
值然后in_array()
在只需要返回一个匹配项时运行将是低效的true
。
对于“大量”数据,其中性能是脚本设计的主要标准,经典foreach
循环将是更好的选择,一旦对象满足规则,则应通过return
or停止循环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)
);