我有一系列数组,通常如果我想检查一个值是否存在,我会遍历数组,在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 要求多个值
不要。
首先,它可能看起来像是代码中的优化,但性能不会改变:在后台,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
做你想做的事。
第四,如果您正在寻找优化并且不确定它是否使其更好,请对其进行分析。最简单的方法是使用微时间:
$before = microtime(true);
// code to test
$now = microtime(true);
echo sprintf("Elapsed: %f", $now-$before);
但是,除非您发现实际问题,否则您不应该尝试优化性能。
in_array呢?return in_array('on', array(1, 0, 'yes', 'no', 'on', 'off'))
http://php.net/manual/en/function.in-array.php
要检查数组中是否存在多个值,就像您在评论中所说的那样,请使用:
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' ;
}
这也适用于一个元素,但它也应该在数组中