$a = (true === !!array_intersect(['1'],[3,2,1])); 之间有啥区别?并检查 in_array

Posted

技术标签:

【中文标题】$a = (true === !!array_intersect([\'1\'],[3,2,1])); 之间有啥区别?并检查 in_array【英文标题】:whats the difference between $a = (true === !!array_intersect(['1'],[3,2,1])); and checking with in_array$a = (true === !!array_intersect(['1'],[3,2,1])); 之间有什么区别?并检查 in_array 【发布时间】:2019-09-10 06:53:40 【问题描述】:

何时使用:-

$a = (true === !!array_intersect(['1'], [3, 2, 1]));

以及何时使用它

$b = in_array('1', [3,2,1]);

两者返回相同。

【问题讨论】:

其实这是正常的。因为如果有相交,array_intersect 返回一个值。根据您的代码,该值为 1。该值为 trueas 逻辑。所以,你的代码是这样的:!!true。结果,true。 in_array 方法直接返回布尔值。因此,这两个代码为您的代码返回相同的值。 为什么要这么复杂? $b = in_array('1',[3,2,1]); - 简单易读。 为什么这个问题被否决了?安静有趣 【参考方案1】:

array_intersect() 返回两个数组的共同元素。在您的代码array_intersect(['1'], [3,2,1]) 中,返回[1],当使用!! 时,它的值为真。因为:

![1]false 再次!false 得到true

最后(true === !!array_intersect(['1'], [3,2,1])) 返回true,因为两个站点都是true。注意:=== 用于严格检查(带类型)。这意味着$a 的值是true

第二部分代码: in_array() 用于检查元素是否存在于数组中。在您的代码中in_array('1',[3,2,1]);true,因为1 存在于数组[3, 2, 1]


array_intersect()in_array()的区别是:

array_intersect($arr1, $arr2) 返回一个数组,该数组在 $arr1$arr2 中都是通用的 in_array($elm, $arr) 根据数组 $arr 中是否存在 $elm 返回一个布尔值(真或假)

由于您的代码的两个部分在逻辑上都得到true,这就是为什么您得到相同的值true

【讨论】:

【参考方案2】:

in_arrayarray_intersect 版本相比更具可读性。但是,与 in_array 相比,array_intersect 是很多 faster。因此,要回答您的问题,请仅在处理的数据集大到足以引发性能问题时才使用 array_intersect。否则,坚持 in_array 将使下一个开发人员的生活更轻松。干杯

【讨论】:

【参考方案3】:

两者是不同的东西。

array_intersect 比较两个数组的值,并返回匹配项:

$a1=array(0=>"red",1=>"green",2=>"blue",3=>"yellow");
$a2=array(0=>"red",1=>"green",2=>"blue");

$result=array_intersect($a1,$a2);
print_r($result);

输出将是

数组([0] => 红色 [1] => 绿色 [2] => 蓝色)

in_array 用于检查值是否存在。

$a1=array(0=>"red",1=>"green",2=>"blue",3=>"yellow");

in_array('red',$a); //true
in_array('black',$a); //false

现在,如果您想检查 值是否存在 在数组中,那么您可以使用 in_array 它会返回 true 或 false,或者如果您想获取 匹配两个数组的值,然后你可以使用 array_intersect

【讨论】:

【参考方案4】:

虽然不太一样。来自docs:

注意:当且仅当 (string) $elem1 === (string) $elem2 时,才认为两个元素相等。换句话说:当字符串表示相同时。

因此,当使用array_intersect() 时,您将始终得到true,但这只是因为您的第二个数组元素“1”的字符串表示与您与之相交的数组的字符串表示相匹配。使用in_array(),您可以有第三个参数strict,它是一个布尔值,用于指示是否还使用类型检查(see here)。因此,在您的第二个示例中,您还可以选择检查类型是否匹配,这是更细粒度的。

就个人而言,无论如何我都会使用第二个选项,只是为了它的可读性。

如果您想在数组中查找元素并获取子数组,那么您应该选择array_intersect(),出于性能原因,请参阅accepted answer to this post

【讨论】:

以上是关于$a = (true === !!array_intersect(['1'],[3,2,1])); 之间有啥区别?并检查 in_array的主要内容,如果未能解决你的问题,请参考以下文章

js中a + 1 < a等于true,(a ==1 && a== 2 && a==3) 等于 true如何实现

将“a == True:”简化为“a”——这是个好主意吗?

c++ 中 BOOL与bool TRUE与true FALSE与false 区别 (转载)

php学习笔记-逻辑运算符

运算符

为啥两个向量的大小<bool> bVec = true,false,true,false,true;向量<char> cVec = 'a', 'b', 'c', 'd',