合并两个数组的优雅方法是什么,这样得到的数组有两个来自第一个数组的项,后跟第二个数组中的一个项,以这种方式重复?
阵列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++];
}
}
答案 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);