通过一次从每个数组中提取 3 个元素,将两个数组合并为一个平面数组
Merge two arrays into one flat array by extracting 3 elements at a time from each
我有两个数组。例如:
$arr1 = [1, 2, 3, 7, 8, 9];
$arr2 = [4, 5, 6, 10, 11, 12, 13, 14];
如何通过从每个数组中取出每 3 个元素来将它们组合成通用数组?输出应该是:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
主要思想是每3个元素取一次。稍后当我理解算法时,数组将包含对象,而不是数字。我需要了解如何通过从每个数组中取出每 3 个元素来组合两个数组。
我想到了这个...
只要任一数组有任何元素,就继续循环。
从每个数组中吸取前三个元素并将它们推入结果数组,直到两个数组中没有任何内容为止。
对我来说似乎很简单。 :)
代码:(Demo)
$arr1 = [1, 2, 3, 7, 8, 9];
$arr2 = [4, 5, 6, 10, 11, 12, 13, 14];
$result = [];
while ($arr1 || $arr2) {
array_push($result, ...array_splice($arr1, 0, 3), ...array_splice($arr2, 0, 3));
}
var_export($result);
输出:
array (
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
5 => 6,
6 => 7,
7 => 8,
8 => 9,
9 => 10,
10 => 11,
11 => 12,
12 => 13,
13 => 14,
)
如果您不想改变原始输入数组,可以这样做:(Demo)
$result = [];
for ($i = 0; isset($arr1[$i]) || isset($arr2[$i]); $i += 3) {
array_push($result, ...array_slice($arr1, $i, 3), ...array_slice($arr2, $i, 3));
}
var_export($result);
所以就像评论说的那样,你可以合并然后排序。这样做的原因以及推荐方法的原因是排序和合并操作应用于最高级别的键值并且不影响合并数组内的 sub-objects/arrays。
<?PHP
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
sort($result);
print_r($result);
?>
但是,如果你真的想做一个“每 3 个元素”的方法。你可以这样做
从 0 循环到 n_smallest_length 数组,然后将较大数组的其余部分附加到末尾,然后在 2 个位置排序以确保将下一组附加到已排序的数组中
- 在每次迭代时对数组进行排序
- 或最后排序
<?PHP
$array_one_size = sizeof($array1);
$array_two_size = sizeof($array2);
$smallest_size = $array_one_size < $array_two_size ? $array_one_size : $array_two_size;
$result = array();
for ($i = 0; $i < $smallest_size; $i += 3) {
$result_tmp = array($array1[$i], $array1[$i + 1], $array1[$i + 2], $array2[$i], $array2[$i + 1], $array2[$i + 2]);
$result = array_merge($result, $result_tmp);
sort($result);
}
if ($smallest_size == $array_one_size) {
$result = array_merge($result, array_slice($array1, $i);
} else {
$result = array_merge($result, array_slice($array2, $i);
}
sort($result);
print_r($result);
?>
注意:另外,上面显示的案例非常适合易于排序的元素。如果您想使用更复杂的元素数组,则只需将 sort($result);
行替换为适合您需要的自定义排序算法即可。
我有两个数组。例如:
$arr1 = [1, 2, 3, 7, 8, 9];
$arr2 = [4, 5, 6, 10, 11, 12, 13, 14];
如何通过从每个数组中取出每 3 个元素来将它们组合成通用数组?输出应该是:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
主要思想是每3个元素取一次。稍后当我理解算法时,数组将包含对象,而不是数字。我需要了解如何通过从每个数组中取出每 3 个元素来组合两个数组。
我想到了这个...
只要任一数组有任何元素,就继续循环。
从每个数组中吸取前三个元素并将它们推入结果数组,直到两个数组中没有任何内容为止。
对我来说似乎很简单。 :)
代码:(Demo)
$arr1 = [1, 2, 3, 7, 8, 9];
$arr2 = [4, 5, 6, 10, 11, 12, 13, 14];
$result = [];
while ($arr1 || $arr2) {
array_push($result, ...array_splice($arr1, 0, 3), ...array_splice($arr2, 0, 3));
}
var_export($result);
输出:
array (
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
5 => 6,
6 => 7,
7 => 8,
8 => 9,
9 => 10,
10 => 11,
11 => 12,
12 => 13,
13 => 14,
)
如果您不想改变原始输入数组,可以这样做:(Demo)
$result = [];
for ($i = 0; isset($arr1[$i]) || isset($arr2[$i]); $i += 3) {
array_push($result, ...array_slice($arr1, $i, 3), ...array_slice($arr2, $i, 3));
}
var_export($result);
所以就像评论说的那样,你可以合并然后排序。这样做的原因以及推荐方法的原因是排序和合并操作应用于最高级别的键值并且不影响合并数组内的 sub-objects/arrays。
<?PHP
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
sort($result);
print_r($result);
?>
但是,如果你真的想做一个“每 3 个元素”的方法。你可以这样做 从 0 循环到 n_smallest_length 数组,然后将较大数组的其余部分附加到末尾,然后在 2 个位置排序以确保将下一组附加到已排序的数组中
- 在每次迭代时对数组进行排序
- 或最后排序
<?PHP
$array_one_size = sizeof($array1);
$array_two_size = sizeof($array2);
$smallest_size = $array_one_size < $array_two_size ? $array_one_size : $array_two_size;
$result = array();
for ($i = 0; $i < $smallest_size; $i += 3) {
$result_tmp = array($array1[$i], $array1[$i + 1], $array1[$i + 2], $array2[$i], $array2[$i + 1], $array2[$i + 2]);
$result = array_merge($result, $result_tmp);
sort($result);
}
if ($smallest_size == $array_one_size) {
$result = array_merge($result, array_slice($array1, $i);
} else {
$result = array_merge($result, array_slice($array2, $i);
}
sort($result);
print_r($result);
?>
注意:另外,上面显示的案例非常适合易于排序的元素。如果您想使用更复杂的元素数组,则只需将 sort($result);
行替换为适合您需要的自定义排序算法即可。