php使用array_flip检查值是否存在vs iterating和if语句

时间:2013-09-13 15:58:13

标签: php arrays

我有一系列数组,通常如果我想检查一个值是否存在我迭代数组,在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要求多个值

3 个答案:

答案 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_arrayarray_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' ;
}

这也适用于一个元素,但它也应该在数组中