【问题标题】:php - merge 3 or more arrays without replacing same keys alternating valuesphp - 合并 3 个或更多数组而不替换相同的键交替值
【发布时间】:2017-05-09 11:36:06
【问题描述】:

我需要合并 3 个具有相同键的数组。结果必须是一个数组包含三个数组的交替值。

例子

$array1 = array(
   array("social"=>"facebook", "id"=>"fewf", "name"=>"bbb"),
   array("social"=>"facebook", "id"=>"fr43", "name"=>"ccc"),
   array("social"=>"facebook", "id"=>"fewf", "name"=>"ddd")
);

$array2 = array(
   array("social"=>"twitter", "id"=>"are5", "name"=>"ddd"),
   array("social"=>"twitter", "id"=>"q23q", "name"=>"eee"),
   array("social"=>"twitter", "id"=>"g55h", "name"=>"off"),
   array("social"=>"twitter", "id"=>"r3r3", "name"=>"bgf"),
   array("social"=>"twitter", "id"=>"f333", "name"=>"1qa")
);

$array3 = array(
   array("social"=>"instagram", "id"=>"bv33", "name"=>"ggg"),
   array("social"=>"instagram", "id"=>"nh44", "name"=>"hhh"),
   array("social"=>"instagram", "id"=>"tt12", "name"=>"iii")
);

-------------------------------------- RESULT ARRAY 必须是备用的。

$array_merged = array(
   array("social"=>"facebook", "id"=>"fewf", "name"=>"bbb"),
   array("social"=>"twitter", "id"=>"are5", "name"=>"ddd"),
   array("social"=>"instagram", "id"=>"bv33", "name"=>"ggg"),
   array("social"=>"facebook", "id"=>"fr43", "name"=>"ccc"),
   array("social"=>"twitter", "id"=>"q23q", "name"=>"eee"),
   array("social"=>"instagram", "id"=>"nh44", "name"=>"hhh"),
   array("social"=>"facebook", "id"=>"fewf", "name"=>"ddd"),
   array("social"=>"twitter", "id"=>"g55h", "name"=>"off"),
   array("social"=>"instagram", "id"=>"tt12", "name"=>"iii"),
   array("social"=>"twitter", "id"=>"r3r3", "name"=>"bgf"),
   array("social"=>"twitter", "id"=>"f333", "name"=>"1qa")
);

如何做到这一点?让最终数组以另一种方式添加每个数组?

------------------ 更新

我已尝试执行以下操作:

$new = array();
for ($i=0; $i < $array2; $i++) {
   $new[] = $array1[$i];
   $new[] = $array2[$i];
   $new[] = $array3[$i];
}

但是,当另一个索引完成时,结果给了我空数组。

【问题讨论】:

  • $array2 已在您的代码中被覆盖,为什么?
  • 对不起我的错误..修复它。
  • 我猜,这不仅仅是合并数组,而是以偶数顺序排列合并的序列facebook - twitter - instagram,对吧?
  • 是的@RomanPerekhrest 是对的!如果一个数组比另一个数组短,则结果不必合并空数组
  • 好的,我有一个针对您当前特定输入的解决方案,但是如果数组之间的大小存在很大差异怎么办?例如:$array1 有 3 个项目,$array2 有 7 个项目,$array3 有 12 个项目,这种情况应该是什么结果?

标签: php arrays merge array-merge


【解决方案1】:
$new = array();
$maxval = max(count($array1),count($array2),count($array3));
for ($i=0; $i < $maxval; $i++) {
if(array_key_exists($i, $array1)) $new[] = $array1[$i];
if(array_key_exists($i, $array2)) $new[] = $array2[$i];
if(array_key_exists($i, $array3)) $new[] = $array3[$i];
}

【讨论】:

    【解决方案2】:

    我一直在玩,并提出了一个灵活的解决方案,它适用于您想要的任意数量的数组以及不同数量的项目:

    // Group arrays in a containing array for processing
    $groupedArrays = array($array1, $array2, $array3);
    
    $maxArrayItems = max(array_map(function($array) {
        return count($array);
    }, $groupedArrays));
    
    $new = array();
    
    // Loop through the amount of times required for the largest array
    for ($i=0; $i < $maxArrayItems; $i++) {
    
        // Loop through for each array in the group of arrays
        for($j=0; $j < count($groupedArrays); $j++) {
    
            if(isset($groupedArrays[$j][$i])) {
                $new[] = $groupedArrays[$j][$i];    
            }
        }
    }
    

    如果您有任何额外的数组,只需将它们添加到 $groupedArrays 数组即可处理。

    希望这会有所帮助!

    【讨论】:

    • 哇!!非常感谢..您的答案正是我想要的!
    • 没问题。很高兴我能帮上忙!
    【解决方案3】:

    为什么不使用array_merge

    >>> $array1 = array(
    ...    array("social"=>"facebook", "id"=>"fewf", "name"=>"bbb"),
    ...    array("social"=>"facebook", "id"=>"fr43", "name"=>"ccc"),
    ...    array("social"=>"facebook", "id"=>"fewf", "name"=>"ddd")
    ... );
    => [
         [
           "social" => "facebook",
           "id" => "fewf",
           "name" => "bbb",
         ],
         [
           "social" => "facebook",
           "id" => "fr43",
           "name" => "ccc",
         ],
         [
           "social" => "facebook",
           "id" => "fewf",
           "name" => "ddd",
         ],
       ]
    >>> 
    >>> $array2 = array(
    ...    array("social"=>"twitter", "id"=>"are5", "name"=>"ddd"),
    ...    array("social"=>"twitter", "id"=>"q23q", "name"=>"eee"),
    ...    array("social"=>"twitter", "id"=>"g55h", "name"=>"off"),
    ...    array("social"=>"twitter", "id"=>"r3r3", "name"=>"bgf"),
    ...    array("social"=>"twitter", "id"=>"f333", "name"=>"1qa")
    ... );
    => [
         [
           "social" => "twitter",
           "id" => "are5",
           "name" => "ddd",
         ],
         [
           "social" => "twitter",
           "id" => "q23q",
           "name" => "eee",
         ],
         [
           "social" => "twitter",
           "id" => "g55h",
           "name" => "off",
         ],
         [
           "social" => "twitter",
           "id" => "r3r3",
           "name" => "bgf",
         ],
         [
           "social" => "twitter",
           "id" => "f333",
           "name" => "1qa",
         ],
       ]
    >>> 
    >>> $array3 = array(
    ...    array("social"=>"instagram", "id"=>"bv33", "name"=>"ggg"),
    ...    array("social"=>"instagram", "id"=>"nh44", "name"=>"hhh"),
    ...    array("social"=>"instagram", "id"=>"tt12", "name"=>"iii")
    ... );
    => [
         [
           "social" => "instagram",
           "id" => "bv33",
           "name" => "ggg",
         ],
         [
           "social" => "instagram",
           "id" => "nh44",
           "name" => "hhh",
         ],
         [
           "social" => "instagram",
           "id" => "tt12",
           "name" => "iii",
         ],
       ]
    >>> array_merge($array1, $array2, $array3)
    => [
         [
           "social" => "facebook",
           "id" => "fewf",
           "name" => "bbb",
         ],
         [
           "social" => "facebook",
           "id" => "fr43",
           "name" => "ccc",
         ],
         [
           "social" => "facebook",
           "id" => "fewf",
           "name" => "ddd",
         ],
         [
           "social" => "twitter",
           "id" => "are5",
           "name" => "ddd",
         ],
         [
           "social" => "twitter",
           "id" => "q23q",
           "name" => "eee",
         ],
         [
           "social" => "twitter",
           "id" => "g55h",
           "name" => "off",
         ],
         [
           "social" => "twitter",
           "id" => "r3r3",
           "name" => "bgf",
         ],
         [
           "social" => "twitter",
           "id" => "f333",
           "name" => "1qa",
         ],
         [
           "social" => "instagram",
           "id" => "bv33",
           "name" => "ggg",
         ],
         [
           "social" => "instagram",
           "id" => "nh44",
           "name" => "hhh",
         ],
         [
           "social" => "instagram",
           "id" => "tt12",
           "name" => "iii",
         ],
       ]
    

    使用时,请特别注意手册中的以下注意事项:

    如果输入数组有相同的字符串键,那么后面的值 因为该键将覆盖前一个键。但是,如果数组 包含数字键,后面的值不会覆盖原来的 值,但会被附加。

    输入数组中带有数字键的值将重新编号为 在结果数组中从零开始递增键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2013-09-12
      • 2012-10-26
      • 1970-01-01
      相关资源
      最近更新 更多