提问人:ballack832 提问时间:3/8/2021 最后编辑:mickmackusaballack832 更新时间:3/8/2021 访问量:318
通过一次从每个 [closed] 中提取 3 个元素,将两个数组合并为一个平面数组
Merge two arrays into one flat array by extracting 3 elements at a time from each [closed]
问:
我有两个数组。例如:
$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 个元素来组合两个数组。
答:
3赞
mickmackusa
3/8/2021
#1
这浮现在脑海中......
只需在任一数组具有任何元素时继续循环即可。
从每个数组中吸取前三个元素,并将它们推送到结果数组中,直到两个数组中什么都没有了。
对我来说似乎很简单。:)
代码:(演示)
$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,
)
如果您不想改变原始输入数组,这将执行以下操作:(演示)
$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);
0赞
adarian
3/8/2021
#2
所以就像评论说的那样,你可以合并然后排序。这样做的原因以及推荐使用方法的原因是因为排序和合并操作适用于最高级别的键值,并且不会影响合并数组内的子对象/数组。
<?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);
评论
1赞
mickmackusa
3/8/2021
...我的方式更简单。在OP显示编码尝试之前,我不会取消删除我的答案。但你强迫了我的手。我们实际上不知道是否是需要的或相关的。OP 可能使用样本数据中的算术来反映输出的排序方式,而不是说实际输入将具有这样的值。sort
0赞
adarian
3/8/2021
不用担心,我只是看到他想要一个算法,并假设他不想要一个有很多内置函数的算法,因为看起来他仍然在努力学习基础知识。
0赞
adarian
3/8/2021
但是,我真的很喜欢你的解决方案@mickmackusa,我完全忘记了 while 循环的那个技巧!
0赞
adarian
3/8/2021
@mickmackusa “我们实际上不知道这种排序是需要的还是相关的。” ->这就是我在最后添加注释的原因
0赞
adarian
3/8/2021
不?我喜欢你回答的简单性
评论