【问题标题】:How to return array with true/false values comparing 2 arrays?如何返回具有真/假值比较 2 个数组的数组?
【发布时间】: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
}

等等...
重要的是输出数组包含所有类别及其结果(真、假)以供发布。
有什么简单的方法可以做到,或者我可以使用它的功能吗?

【问题讨论】:

    标签: php arrays wordpress


    【解决方案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_valuesarray_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;
        }
        

        【讨论】:

          猜你喜欢
          • 2019-08-31
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          • 2018-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-08
          相关资源
          最近更新 更多