PHP 使用array_flip来检查值是否存在与迭代和 if 语句


php using array_flip to check if value exists vs iterating and if statement

我有一系列数组,通常如果我想检查一个值是否存在,我会遍历数组,在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_arrayarray_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' ;
}

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