我有一系列数组,通常如果我想检查一个值是否存在我迭代数组,在foreach块内部使用if语句然后中断或返回,但最近我决定使用array_flip来翻转数组然后检查密钥是否与isset一起存在:
<?php
$arr = array(1, 0, 'yes', 'no', 'on', 'off' /* more keys */);
/*
foreach($arr as $value) {
if ($value === 'on') { return 'xxx'; }
}
*/
//Alternative
$arrFlipped = array_flip($arr);
if (isset($arrFlipped['on'])) { return xxx; }
?>
数组由安全数据而非用户输入组成,因此值始终为有效键。
我想知道这个例子是否合适,有什么优点和缺点?哪一个更快或浪费更少的资源? 对不起我的英文...谢谢!
修改 OP要求多个值
答案 0 :(得分:2)
别。
首先,它可能看起来像是代码中的优化,但性能不会改变:在后台,PHP无论如何都必须遍历数组。
其次,不要“聪明”。您在代码中使用的“技巧”越多,维护代码就越难。从现在开始的6个月,你会想到为什么 * *你决定翻转阵列(你或任何负责维护你的代码的人)。
如果你真的想要实现这样的东西,至少要封装在一个明确命名的函数中,这样你才能看到你想要的东西:
function value_exists($arr, $value){
$arrFlipped = array_flip($arr);
if (isset($arrFlipped["$value"])) { return xxx;
}else{ return false; }
}
这样,当你写return value_exists($arr, $value);
时你所做的事情是显而易见的,即使你的实施是不寻常的。
第三,您可以使用in_array
或array_search
来做您想做的事。
第四,如果您正在寻找优化而且您不确定它是否会使其更好,那么只需对其进行分析即可。最简单的方法是使用microtime:
$before = microtime(true);
// code to test
$now = microtime(true);
echo sprintf("Elapsed: %f", $now-$before);
但除非您发现实际问题,否则不应尝试优化性能。
答案 1 :(得分:1)
in_array怎么样?
return in_array('on', array(1, 0, 'yes', 'no', 'on', 'off'))
http://php.net/manual/en/function.in-array.php
答案 2 :(得分:1)
要检查数组中是否存在多个值,就像您在评论中所述,请使用:
array_intersect()
返回一个数组,其中包含所有参数中存在的array1的所有值。请注意,密钥会被保留。
将$ target与$ arr相交,并确保交集正好等于$ target中的元素数:
$arr = array(1, 0, 'yes', 'no', 'on', 'off' /* more keys */);
$target = array('yes', 'off');
if(count(array_intersect($arr, $target)) == count($target)){
echo 'all values found in array' ;
}
这也适用于一个元素,但它也应该在数组中