php - 合并 3 个或更多数组而不替换相同的键交替值

php - merge 3 or more arrays without replacing same keys alternating values

我需要合并 3 个具有相同键的数组。结果必须是一个数组包含 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];
}

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

$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];
}

我一直在尝试并想出了一个灵活的解决方案,可以根据需要使用任意数量的数组以及不同数量的项目:

// 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 数组中,它们就会被处理。

希望对您有所帮助!

为什么不使用 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",
     ],
   ]

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

If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended.

Values in the input array with numeric keys will be renumbered with incrementing keys starting from zero in the result array.