php使用array_flip检查值是否存在vs迭代和if语句
我有一系列数组,通常如果我想检查值是否存在,我会通过数组进行迭代,在foreach块中使用if语句,然后断开或返回,但最近我决定使用array_flip来翻转数组,然后使用isset检查键是否存在: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
<?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检查我的答案吗