在PHP中不对称地组合2个数组的优雅方式

时间:2012-09-20 20:17:42

标签: php arrays

合并两个数组的优雅方法是什么,这样得到的数组有两个来自第一个数组的项,后跟第二个数组中的一个项,以这种方式重复?

阵列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 个答案:

答案 0 :(得分: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替换为[。

答案 1 :(得分: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有破坏性。

答案 2 :(得分: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()弹出并返回数组的最后一个值,将数组缩短一个元素。如果array为空(或不是数组),则返回NULL。在非数组上调用时还会产生警告。

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

答案 3 :(得分: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);