如何使用比较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把它们变成填充TRUEFALSE,最后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 
+1

聪明! 'array_fill_keys'是我从来不用的函数。 – DataHerder

这很慢,但它应该做你想做的,并且很容易理解。

// 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_maparray_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 
+0

不错的解决方案! –

随着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应用于每个数组。