我想我可以用这样的foreach循环来做到这一点:
foreach ($haystack as $item)
if (isset($item->$needle_field) && $item->$needle_field == $needle)
return true;
}
但如果可以在没有循环的情况下完成,我会徘徊吗?
类似的东西:
if(in_array($item->$needle_field == $needle,$haystack)
return true;
答案 0 :(得分:3)
这是可能的,但它没有任何好处:
<?php
function make_subject($count, $success) {
$ret = array();
for ($i = 0; $i < $count; $i++) {
$object = new stdClass();
$object->foo = $success ? $i : null;
$ret[] = $object;
}
return $ret;
}
// Change true to false for failed test.
$subject = make_subject(10, true);
if (sizeof(array_filter($subject, function($value) {
return $value->foo === 3;
}))) {
echo 'Value 3 was found!';
} else {
echo 'Value 3 was not found.';
}
输出Value 3 was found!
。
我建议你继续使用for循环:它是清晰的,不像保存你可能找到的任何一个技巧。
答案 1 :(得分:1)
是的,在现代PHP中,您可以通过组合array_column()
(已经演化为也处理对象数组)的作用力来确定特定对象属性是否包含特定值而没有经典循环。 }。
代码:(Demo)
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
。
代码:(Demo)
break
答案 2 :(得分:0)
如果要搜索的阵列超出控制范围,则此方法将不起作用。 但是,如果您是构建要搜索的对象数组的人,则可以在搜索时使用针作为array_key_exists使用的数组键来构造它。
例如,不要像这样创建$haystack
数组:
[
{
'needle_field' => $needle
},
...
]
使它像这样:
[
$needle => {
'needle_field' => $needle
},
...
]
并像这样搜索:
if (array_key_exists($needle, $haystack)) {
return true;
}
最后,如果需要,可以使用array_values
转换回整数索引数组$haystack = array_values($haystack);
这可能无法在所有情况下都起作用,但对我来说很好。
答案 3 :(得分:-1)
也许使用array_key_exists
:
if (array_key_exists($needle_field, $haystack) {
if ($haystack[$needle_field] == $needle) {
echo "$needle exists";
}
}