我想我可以用这样的 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)