【问题标题】:Merge two arrays into one flat array by extracting 3 elements at a time from each [closed]通过从每个 [关闭] 中一次提取 3 个元素,将两个数组合并为一个平面数组
【发布时间】:2021-06-05 22:24:11
【问题描述】:

我有两个数组。例如:

 $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 个元素来组合两个数组。

【问题讨论】:

  • 合并数组,然后排序。 google.com 上的两分钟将向您展示如何操作。
  • 主要思想是组合每 3 个元素。后来当我理解算法时,数组将有对象,而不是数字。我需要了解如何通过从每个数组中获取每 3 个元素来组合两个数组。
  • 由于某种原因,您的研究证明和最佳失败的编码尝试未包含在您的问题中。
  • 对我来说,我更喜欢人们在尚未展示代码尝试时寻求帮助的想法,因为每个人都从头开始
  • @ball 现在编辑您的问题还为时不晚。这通常有助于保护您免受反对票的影响。即使是伪代码也比没有努力/研究证明要好。 (请阅读上下投票按钮的鼠标悬停文本)。

标签: php arrays algorithm merge slice


【解决方案1】:

想到这个……

当任一数组有任何元素时,继续循环。

从每个数组中提取前三个元素并将它们推入结果数组,直到两个数组中没有任何内容。

对我来说似乎很简单。 :)

代码:(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);

【讨论】:

    【解决方案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 个位置进行排序,以确保将下一组附加到已排序的数组中

    1. 在每次迭代时对数组进行排序
    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); 行替换为适合您需求的自定义排序算法即可。

    【讨论】:

    • ...让我的方式更简单。在 OP 显示编码尝试之前,我不会取消删除我的答案。但你强迫我的手。我们实际上不知道sort 是否是需要的或相关的。 OP 可能使用样本数据中的数值来反映输出的排序方式——而不是真正的输入会有这样的值。
    • 别担心,我只是看到他想要一个算法,并假设他不想要一个有很多内置函数的算法,因为他似乎还在努力学习基础知识。
    • 但是,我真的很喜欢你的解决方案@mickmackusa,我完全忘记了 while 循环的那个技巧!
    • @mickmackusa “我们实际上不知道这种排序是需要的还是相关的。” -> 这就是我在末尾添加注释的原因
    • 不是吗?我喜欢你的简单回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2021-07-16
    相关资源
    最近更新 更多