如何使用比较2个数组的真/假值返回数组?
我试图产生数组作为比较例2的阵列的结果:第一阵列具有更多的元件,诸如:如何使用比较2个数组的真/假值返回数组?
array1: {
0 => "car1"
1 => "car2"
2 => "car3"
3 => "car4"
4 => "car5"
}
和第二阵列具有不是所有的元素:
array2: {
0 => "car1"
1 => "car4"
2 => "car5"
}
所以有所有可能的类别(array1)和分类到post(array2)的类别(这是一个WordPress的东西)。
我想比较该数组(但不是与array_diff()
函数,它给了我的元素值而不是布尔值),并得到结果为真/假。所以我想比较数组的每个值并产生阵图或可能使用array_combine()
函数获取数组这样的:
result_array: {
"car1": true,
"car2": false,
"car3": false
}
等...
这是输出数组重要的有所有类别和其结果(真,假)发布。
有没有简单的方法来做到这一点,或者它可以使用的功能?
阵列的乐趣!
PHP有一个TON的数组函数,所以有很多潜在的解决方案。
我想出了这个作为个人的挑战,它不使用循环,过滤器或地图。
此解决方案使用array_intersect找到与array_fill_keys沿着存在于两个阵列的值,那么array_values把它们变成填充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
这很慢,但它应该做你想做的,并且很容易理解。
// 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;
}
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)
}
<?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
不错的解决方案! –
随着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
应用于每个数组。
聪明! 'array_fill_keys'是我从来不用的函数。 – DataHerder