Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php使用array_flip检查值是否存在vs迭代和if语句_Php_Arrays - Fatal编程技术网

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

php使用array_flip检查值是否存在vs迭代和if语句,php,arrays,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

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

数组中的值如何?
在数组中返回('on',数组(1,0,'yes','no','on','off'))

在阵列中呢?
在数组中返回('on',数组(1,0,'yes','no','on','off'))


要检查数组中是否存在多个值,如您在评论中所说,请使用:

array\u 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' ;
}

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

要检查数组中是否存在多个值,如您在注释中所述,请使用:

array\u 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' ;
}
这也适用于一个元素,但它也应该在数组中

首先,它可能看起来像是对代码的优化,但性能不会改变:在后台,PHP无论如何都必须在数组中循环

第二,不要“聪明”。在代码中使用的“技巧”越多,维护代码就越困难。6个月后,你会挠头想为什么**你决定翻转数组(你或负责维护代码的人)

如果您真的想实现类似的功能,请至少封装在一个名称明确的函数中,这样您就可以看到您要实现的功能:

function value_exists($arr, $value){
    $arrFlipped = array_flip($arr);
    if (isset($arrFlipped["$value"])) { return xxx; 
    }else{ return false; }
}
这样,当您编写
时,返回值_存在($arr,$value)您所做的是显而易见的,即使您的实现是不寻常的

第三,您可以在数组中使用
array\u search
来执行您想要的操作

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

$before = microtime(true);
// code to test
$now = microtime(true);
echo sprintf("Elapsed:  %f", $now-$before);
但是,除非您注意到实际问题,否则您不应该尝试优化性能

不要

首先,它可能看起来像是对代码的优化,但性能不会改变:在后台,PHP无论如何都必须在数组中循环

第二,不要“聪明”。在代码中使用的“技巧”越多,维护代码就越困难。6个月后,你会挠头想为什么**你决定翻转数组(你或负责维护代码的人)

如果您真的想实现类似的功能,请至少封装在一个名称明确的函数中,这样您就可以看到您要实现的功能:

function value_exists($arr, $value){
    $arrFlipped = array_flip($arr);
    if (isset($arrFlipped["$value"])) { return xxx; 
    }else{ return false; }
}
这样,当您编写
时,返回值_存在($arr,$value)您所做的是显而易见的,即使您的实现是不寻常的

第三,您可以在数组中使用
array\u search
来执行您想要的操作

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

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

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

速度将取决于数组中的条目数;但是如果你正在搜索一个精确的值,为什么不在数组()或数组中使用呢?是的,我现在知道了,但是我没有指出我可能会对不同的值执行不同的操作,而不是返回。速度取决于数组中的条目数;但是如果你在搜索一个精确的值,为什么不使用in_array()或array_search()?是的,我现在知道了,但是我没有指出我可能对不同的值执行不同的操作而不是返回。太好了,但是如果我必须对不同的值执行不同的操作而不是返回,我应该使用几个if吗(in_array(…){do this}?@PuertoAGP检查我的答案很好,但是如果我必须对不同的值执行不同的操作而不是返回,我应该使用几个if(in_array(…){do this}?@PuertoAGP检查我的答案吗