如何返回具有真/假值比较 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_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)

【讨论】:

【参考方案2】:

数组很有趣!

PHP 有大量的数组函数,因此有很多潜在的解决方案。

我想出了这个作为个人挑战,它不使用循环、过滤器或地图。

此解决方案使用array_intersect 查找两个数组中都存在的值,然后使用array_values 和array_fill_keys 将它们转换为填充有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

【讨论】:

聪明! 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 个数组的数组?的主要内容,如果未能解决你的问题,请参考以下文章

当另一个数组有一个数字(值)时如何匹配2个数组的字符串值

比较具有相同项目但在随机位置的数组时如何返回true?

比较 2 个数组并列出差异 - Swift

如何创建一个包含 2 个数组的字典?

使用 Linq 和 Regex 比较 2 个字符串数组以进行部分匹配

比较2个数组并列出差异 - Swift