1

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

4

3 回答 3

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_arrayorarray_search来做你想做的事。

第四,如果您正在寻找优化并且不确定它是否会变得更好,那么只需对其进行分析。最简单的方法是使用 microtime:

$before = microtime(true);
// code to test
$now = microtime(true);
echo sprintf("Elapsed:  %f", $now-$before);

但是,除非您注意到实际问题,否则您不应该尝试优化性能。

于 2013-09-13T16:36:44.237 回答
1

in_array 呢?
return in_array('on', array(1, 0, 'yes', 'no', 'on', 'off'))
http://php.net/manual/en/function.in-array.php

于 2013-09-13T16:01:53.090 回答
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' ;
}

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

于 2013-09-13T16:14:50.587 回答