通过一次从每个数组中提取 3 个元素,将两个数组合并为一个平面数组

问题描述 投票:0回答:2

我有两个数组。例如:

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

php arrays algorithm merge slice
2个回答
4
投票

我想到了这个...

只要任一数组有任何元素就继续循环。

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

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

代码:(演示

$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);

0
投票

就像评论说的那样,你可以先合并然后排序。这样做的原因以及为什么它是推荐的方法是因为排序和合并操作适用于最高级别的键值,并且不会影响合并数组内的子对象/数组。

<?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);
行即可。

© www.soinside.com 2019 - 2024. All rights reserved.