如何返回具有真/假值比较 2 个数组的数组?
Posted
技术标签:
【中文标题】如何返回具有真/假值比较 2 个数组的数组?【英文标题】:How to return array with true/false values comparing 2 arrays? 【发布时间】:2017-04-08 02:53:08 【问题描述】:我正在尝试生成数组作为比较 2 个数组的结果:第一个数组有更多元素,例如:
array1:
0 => "car1"
1 => "car2"
2 => "car3"
3 => "car4"
4 => "car5"
第二个数组没有所有元素:
array2:
0 => "car1"
1 => "car4"
2 => "car5"
所以有所有可能的类别 (array1) 和分配给帖子 (array2) 的类别(这是 WordPress 的事情)。
我正在尝试比较该数组(但不是使用array_diff()
函数,它给了我元素值而不是布尔值)并将结果作为真/假。所以我想比较数组的每个值并生成 array map 或者使用array_combine()
函数来获取这样的数组:
result_array:
"car1": true,
"car2": false,
"car3": false
等等... 重要的是输出数组包含所有类别及其结果(真、假)以供发布。 有什么简单的方法可以做到,或者我可以使用它的功能吗?
【问题讨论】:
【参考方案1】:array_map
或 array_combine
实际上并没有返回你想要的。如果您想在不编写 foreach 循环的情况下使用 array_map
达到所需的效果,下面将为您提供所需的结果。请注意,您必须传递 array3
作为参考。
<?php
$array1 = array( 0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5");
$array2 = array( 0 => "car1", 1 => "car4", 2 => "car5" );
$array3 = [];
array_map(function($a) use ($array2, &$array3)
$array3[$a] = in_array($a, array_values($array2));
, $array1);
var_dump($array3);
输出:
array(5)
["car1"]=>
bool(true)
["car2"]=>
bool(false)
["car3"]=>
bool(false)
["car4"]=>
bool(true)
["car5"]=>
bool(true)
【讨论】:
【参考方案2】:数组很有趣!
PHP 有大量的数组函数,因此有很多潜在的解决方案。
我想出了这个作为个人挑战,它不使用循环、过滤器或地图。
此解决方案使用array_intersect 查找两个数组中都存在的值,然后使用array_values 和array_fill_keys 将它们转换为填充有TRUE
或FALSE
的关联数组,最后将array_merge 放入将它们组合成一个数组:
$array1 = array( 0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5");
$array2 = array( 0 => "car1", 1 => "car4", 2 => "car5" );
// Find all values that exist in both arrays
$intersect = array_intersect( $array1, $array2 );
// Turn it into an associative array with TRUE values
$intersect = array_fill_keys( array_values($intersect), TRUE );
// Turn the original array into an associative array with FALSE values
$array1 = array_fill_keys( array_values( $array1 ), FALSE );
// Merge / combine the arrays - $intersect MUST be second so that TRUE values override FALSE values
$results = array_merge( $array1, $intersect );
var_dump( $results );
结果:
array (size=5)
'car1' => boolean true
'car2' => boolean false
'car3' => boolean false
'car4' => boolean true
'car5' => boolean true
【讨论】:
聪明!array_fill_keys
是我从未使用过的函数。【参考方案3】:
array_count_values
就这么简单:
$results = array_map(function ($count)
return $count !== 1;
, array_count_values(array_merge($array1, $array2)));
所以基本上,我们将两个数组合并在一起,然后计算值的出现次数。然后如果计数不等于 1,我们将值映射到 true
,否则 - false
。有趣的是,无论哪个数组更短,这都会起作用。
这里是working demo。
请注意,array_count_values
函数为每个不是字符串或整数的元素抛出 E_WARNING。所以这种方法只适用于字符串和整数数组。
此外,如果您的数组元素不是唯一的,这种方法可能会失败,在这种情况下,您必须事先将array_unique
应用于每个数组。
【讨论】:
【参考方案4】:<?php
//EXAMPLE 1
$array1 = [0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5"];
$array2 = [0 => "car1", 1 => "car4", 2 => "car5"];
$resultArray = [];
foreach ($array1 as $key => $val)
$resultArray[$val] = in_array($val, $array2);
var_dump($resultArray);
?>
<?php
//EXAMPLE 2
$array1 = [0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5"];
$array2 = [0 => "car1", 1 => "car4", 2 => "car5"];
$resultArray = [];
$flipped = array_flip($array2);
foreach ($array1 as $key => $val)
$resultArray[$val] = isset($flipped[$val]);
var_dump($resultArray);
?>
结果:
array (size=5)
'car1' => boolean true
'car2' => boolean false
'car3' => boolean false
'car4' => boolean true
'car5' => boolean true
【讨论】:
不错的解决方案!【参考方案5】:这很慢,但它应该做你想做的,并且容易理解。
// Loop over the outer array which we're told has all the categories
$result = array();
foreach($array1 as $sCar1)
$found = false;
// Loop over the categories of the post
foreach($array2 as $sCar2)
// If the current post category matches
// the current category we're searching for
// note it and move on
if($sCar2 == $sCar1)
$found = true;
break;
// Now indicate in the result if the post has the current category
$result[$sCar1] = $found;
【讨论】:
以上是关于如何返回具有真/假值比较 2 个数组的数组?的主要内容,如果未能解决你的问题,请参考以下文章