【问题标题】:Merge Array of Arrays Recursively on Key在键上递归合并数组数组
【发布时间】:2017-09-15 21:56:22
【问题描述】:

我想将匹配makes 的数组与匹配models 的数组合并,但我知道从哪里开始。我玩过array_merge_recursive,但输出不是我想要的。示例输出:

Array
(
[0] => Array
    (
        [make] => Chevrolet
        [model] => Silverado 1500
    )
)
)

预期输出:

Array
(
[0] => Array
    (
        [make] => Chevrolet
        [model] => Array
        (
            [0] => Silverado 1500
            [1] => Malibu
            [2] => Equinox
            [3] => Camaro
        )
    )

[1] => Array
    (
        [make] => Cadillac
        [model] => XT5
    )

[2] => Array
    (
        [make] => GMC
        [model] => Terrain
    )
)

输入:

Array
(
[0] => Array
    (
        [make] => Chevrolet
        [model] => Silverado 1500
    )

[1] => Array
    (
        [make] => Cadillac
        [model] => XT5
    )

[2] => Array
    (
        [make] => Chevrolet
        [model] => Malibu
    )

[3] => Array
    (
        [make] => Chevrolet
        [model] => Equinox
    )

[4] => Array
    (
        [make] => GMC
        [model] => Terrain
    )

[5] => Array
    (
        [make] => Chevrolet
        [model] => Camaro
    )
[6] => Array
    (
        [make] => Chevrolet
        [model] => Silverado 1500
    )
)

【问题讨论】:

    标签: php arrays multidimensional-array merge


    【解决方案1】:

    您可以使用array_count_valuesarray_splice 来实现这一点,并预先通过'make'array_multisort 对数组进行排序:

    $makes = array_column($array, 'make');
    array_multisort($array, $makes);
    $makes = array_count_values($makes);
    $models = array_column($array, 'model');
    
    $result = [];
    foreach ($makes as $make => $count) {
        $_models = array_splice($models, 0, $count);
        $result[] = [
            'make' => $make,
            'model' => $count === 1 ? $_models[0] : array_unique($_models)
        ];
    }
    

    应用array_unique 确保模型中没有重复项。

    这里是working demo

    【讨论】:

      【解决方案2】:

      Try this code snippet here

      <?php
      
      ini_set('display_errors', 1);
      
      $array = array(
          0 => Array
              (
              "make" => "Chevrolet",
              "model" => "Silverado 1500",
          ),
          1 => Array
              (
              "make" => "Cadillac",
              "model" => "XT5",
          ),
          2 => Array
              (
              "make" => "Chevrolet",
              "model" => "Malibu",
          ),
          3 => Array
              (
              "make" => "Chevrolet",
              "model" => "Equinox",
          ),
          4 => Array
              (
              "make" => "GMC",
              "model" => "Terrain",
          ),
          5 => Array
              (
              "make" => "Chevrolet",
              "model" => "Camaro",
          ),
          6 => Array
              (
              "make" => "Chevrolet",
              "model" => "Silverado 1500",
          ),
      );
      $result=array();
      foreach($array as $key => $value)
      {
          if(!isset($result[$value["make"]]))
          {
              $result[$value["make"]]=$value;
          }
          else
          {
              if(is_string($result[$value["make"]]["model"]))
              {
                  //if current value is string then restoring previous values in array
                  $temp=$result[$value["make"]]["model"];
                  $result[$value["make"]]["model"]=array();
                  $result[$value["make"]]["model"][]=$temp;
              }
              $result[$value["make"]]["model"][]=$value["model"];//adding values to array
          }
      }
      print_r($result);
      

      输出:

      Array
      (
          [Chevrolet] => Array
              (
                  [make] => Chevrolet
                  [model] => Array
                      (
                          [0] => Silverado 1500
                          [1] => Malibu
                          [2] => Equinox
                          [3] => Camaro
                          [4] => Silverado 1500
                      )
      
              )
      
          [Cadillac] => Array
              (
                  [make] => Cadillac
                  [model] => XT5
              )
      
          [GMC] => Array
              (
                  [make] => GMC
                  [model] => Terrain
              )
      
      )
      

      【讨论】:

        【解决方案3】:

        你可以使用 foreach 来获取它。 Live demo

        foreach($array as $v)
        {
          $arr[$v['make']]['make'] = $v['make'];
          $arr[$v['make']]['model'][] = $v['model'];
        }
        $result = array_map(function($v){
        if(count($v['model']) == 1)
          $v['model'] = $v['model'][0];
        return $v;
        }, array_values($arr));
        
        print_r($result);
        

        【讨论】:

        • 你在这里错过了一个[] :-)
        【解决方案4】:

        去罗马的一种方式...

         //$yourArray;
         $newArray=array();
         array_map(function($v) use (&$newArray){
            $newArray[$v['make']]['make']=$v['make'];
            $newArray[$v['make']]['model'][]=$v['model'];
         },$yourArray);
         $newArray = array_values($newArray);
         print_r($newArray);
        

        注意:相同的子数组元素应始终具有相同的类型(此处为数组),因此此处不要将单个数组条目更改为字符串。这更容易从后面的代码中处理(没有if(is_array()){}else{},我从simpleXML 行为中吸取了教训;-))。希望您知道如何根据需要制作字符串。

        祝你有美好的一天。

        【讨论】:

        • 兄弟检查这个eval.in/779135你的输出是错误的匹配它与OP预期输出for single make your are getting array of models,改变你的帖子,否则有人会来反对你。
        • @SahilGulati 所以这只是去罗马的一种方式,如果你呆在罗马的前面,最后的步骤可以由你完成。我不知道你想去罗马的哪个地方。为什么我要这样做:如果一个子数组元素是一个数组,那么所有相等的子元素都应该具有相同的类型(simpleXML 有同样的问题,这常常让人们感到害怕)。这可以防止像if(!is_array($foo)) 这样的东西。但是,谢谢你的注意 ;-)
        猜你喜欢
        • 2017-07-19
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 2014-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多