5

什么是合并两个数组的优雅方法,使得结果数组具有来自第一个数组的两个项目,然后是来自第二个数组的单个项目,以这种方式重复?

数组 1 = A1、A2、A3、A4、A5 等。

数组 2 = B1、B2、B3、B4、B5 等。

结果 = A1、A2、B1、A3、A4、B2、A5、A6、B3 等。

我正在尝试使用带有多个计数器的 for 循环来做到这一点,但我不知道数组长度将始终根据需要长或短。我很好奇:有没有更好的方法?

这是我目前正在做的简化版本:

$x = 0, $y = 0;
for($i=0; $i<$total_num_blocks; $i++) {
    if ($i % 3) {   // if there's a remainder, it's not an 'every 3rd' item
        $result[$i] = $projects[$x++];
    } else {
        $result[$i] = $posts[$y++];
    }
}
4

4 回答 4

4

无论 $a 和 $b 数组大小如何,此示例都将起作用。

<?php 

$a = ['A1', 'A2', 'A3', 'A4', 'A5'];
$b = ['BB1', 'BB2', 'BB3', 'BB4', 'BB5'];

for ($i = 0; $i < count($b); $i++) {
    array_splice($a, ($i+1)*2+$i, 0, $b[$i]);
}

echo "<pre>" . print_r($a, true) . "</pre>";

这个例子的输出是:

Array
(
    [0] => A1
    [1] => A2
    [2] => BB1
    [3] => A3
    [4] => A4
    [5] => BB2
    [6] => A5
    [7] => BB3
    [8] => BB4
    [9] => BB5
)

警告:不保留密钥!

这是 PHP 5.4.x 的代码,如果没有,请将 $a 和 $b 变量中的 [] 替换为 array()。

于 2012-09-20T20:45:29.323 回答
1
while( sizeof($posts) >= 2 && sizeof($projects) >= 1){
    array_push($result,
            array_shift($posts),
            array_shift($posts),
            array_shift($projects)
        );
}
# you will need to handle the case if $posts doesn't have an even number of elements    

注意:这会破坏 $posts 和 $projects。

于 2012-09-20T20:28:41.630 回答
0
   $array1 = array('A1','A2','A3','A4','A5','A6');
   $array2 = array('B1','B2','B3','B4','B5','B6');

   $resultArray = array();

   //Reverse Second Array
   $array2R = array_reverse($array2);

   for ($i = 0; $i < count($array1); $i++){
       $resultArray[] = $array1[$i];
       if (($i) % 2)
           $resultArray[] = array_pop($array2R);
   }

   var_dump($resultArray);

结果与

array(9) { [0]=> string(2) "A1" [1]=> string(2) "A2" [2]=> string(2) "B1" [3]=> string(2) "A3" [4]=> string(2) "A4" [5]=> string(2) "B2" [6]=> string(2) "A5" [7]=> string(2) "A6" [8]=> string(2) "B3"}

您可以反转第二个数组,然后 array_pop 它,而不是跟踪第二个数组。 http://php.net/manual/en/function.array-pop.php

array_pop() 弹出并返回数组的最后一个值,将数组缩短一个元素。如果数组为空(或不是数组),则返回 NULL。在非数组上调用时还会产生警告。

您可能希望通过将 array2 中的所有剩余项添加到结果数组的末尾来完成 Resultant 数组。

于 2012-09-20T20:40:23.200 回答
0

我不知道它是优雅还是高效,您必须自己运行一些基准测试,但是有一种有趣的方法可以在没有循环的情况下合并这些数组:

$a = array("a1","a2","a3","a4","a5","a6","a7","a8"); 
$b = array("b1","b2","b3","b4","b5","b6","b7","b8"); 

function asymmetricInterleave($a, $aCount, $b, $bCount) { 
    $ax = array_chunk($a, $aCount); 
    $bx = array_chunk($b, $bCount); 

    $diff = count($ax) - count($bx); 

    $remainder = array(); 
    if ($diff > 0) { 
        list($ax, $remainder) = array_chunk($ax, count($bx)); 
    } else if ($diff < 0) { 
        list($bx, $remainder) = array_chunk($bx, count($ax)); 
    } 

    $result = array_merge(array_map('array_merge', $ax, $bx), $remainder); 
    return call_user_func_array('array_merge', $result); 
} 


$result = asymmetricInterleave($a, 2, $b, 1); 
var_export($result); 
于 2012-09-21T11:08:20.863 回答