如何返回具有比较2个数组的true / false值的数组?

时间:2016-11-23 23:06:18

标签: php arrays wordpress

我试图通过比较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()函数,它给了我元素值而不是boolean)并得到结果为true / false。所以我想比较数组的每个值并生成数组映射或者使用array_combine()函数来获取这样的数组:

result_array: {
    "car1": true,
    "car2": false,
    "car3": false
}

等...
输出数组具有所有类别及其结果(true,false)非常重要 有没有简单的方法可以做到,或者可能是我可以使用的功能?

5 个答案:

答案 0 :(得分:8)

阵列很有趣!

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

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

此解决方案使用array_intersect查找两个数组中存在的值,然后array_values以及array_fill_keys将它们转换为填充TRUE或{{1}的关联数组}},最后array_merge将它们组合成一个数组:

FALSE

$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 );

答案 1 :(得分:4)

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 :(得分:2)

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

// 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;
}

答案 3 :(得分:2)

<?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

答案 4 :(得分:2)

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