合并多个数组而不是合并它们
Combine multiple arrays not by merging them
我有 3 到 10 个数组,每个数组包含 20 到 50 个值。
我想将它们合并到一个数组中,但不是 array_merge
的工作方式。
我宁愿取第一个数组的第一个值,然后是第二个数组的第一个值,然后是第三个数组的第一个值,依此类推。
键在这里不是问题,它可以是数字或关联数组,我只是保留值,而不是原始键。
实际应用中的值可以混合,因此不能在之后进行合并和排序。
所以如果我有 3 个这样的数组:
$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4');
$array3=array('3-1','3-2');
我需要结果是一个包含以下顺序值的数组:
1-1, 2-1, 3-1, 1-2, 2-2, 3-2, 1-3, 2-3, 2-4
到目前为止,我有这段代码:
$array=array($array1,$array2,$array3);
$newarray=array();
foreach($array as $a){
$v=array_shift($a);
if(isset($v)){
$newarray[]=$v;
}
}
print_r($newarray);
但是,当然,它只运行第一组值并给我:
Array ( [0] => 1-1 [1] => 2-1 [2] => 3-1 )
array_shift
是我在这里需要的,因为它从旧数组中删除了值(我不再需要它了)并将它移动到新数组(如果它 isset
)。参见:http://php.net/manual/en/function.array-shift.php
我很确定我需要一个函数并循环它直到所有数组都为空,但我就是无法理解这个函数。任何帮助将不胜感激。如果有人知道执行此操作的本机 php 函数,甚至更好。
您可以使用 + 运算符。
$c = $a + $b
祝你好运!
试试这个代码
$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4');
$array3=array('3-1','3-2');
$array=array($array1,$array2,$array3);
$array2 = $array ;
function cmp($a, $b){
return (count($b) - count($a));
}
usort($array2, 'cmp');
$xax_length = count($array2[0]);
$newarray=array();
for($i=0;$i<$xax_length;$i++) {
foreach($array as &$a){
$v=array_shift($a);
if(isset($v)){
$newarray[]=$v;
}
}
}
print_r($newarray);
我建议在 for
循环中散列所有数组。
$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4','2-5');
$array3=array('3-1','3-2');
$maxSize=max(count($array1),count($array2),count($array3));
$array=array($array1,$array2,$array3);
$newarray=array();
for ($i = 0; $i < $maxSize; $i++) {
for ($x = 0; $x < count($array); $x++) {
if(count($array[$x]) > $i){
$newarray[] = $array[$x][$i];
}
}
}
print_r($newarray);
仅供参考,如果你是运行 PHP 5.6+,你可以利用the new ...
operator to signify n number of arguments in a function declaration and/or call. Implementation would be something like this (reference):
function merge_vertical(...$arrays) {
return array_filter(array_merge(...array_map(null, ...$arrays)));
}
print_r(merge_vertical($array1, $array2, $array3));
Array
(
[0] => 1-1
[1] => 2-1
[2] => 3-1
[3] => 1-2
[4] => 2-2
[5] => 3-2
[6] => 1-3
[7] => 2-3
[10] => 2-4
)
这是一个简单的单行...
$arr1 = ['1-1', '1-2', '1-3'];
$arr2 = ['2-1', '2-2', '2-3', '2-4'];
$arr3 = ['3-1', '3-2'];
$result = array_filter(call_user_func_array(array_merge, array_map(null, $arr1, $arr2, $arr3)));
所以,也许不是那么简单...一些解释。
array_map(null, ...);
利用 PHP docs 示例 4 中解释的 array_map
的特性,但没有对值进行任何转换(因此为空)。
所以,这会给你:
array(4) {
[0]=>
array(3) {
[0]=>
string(3) "1-1"
[1]=>
string(3) "2-1"
[2]=>
string(3) "3-1"
}
[1]=>
array(3) {
[0]=>
string(3) "1-2"
[1]=>
string(3) "2-2"
[2]=>
string(3) "3-2"
}
[2]=>
array(3) {
[0]=>
string(3) "1-3"
[1]=>
string(3) "2-3"
[2]=>
NULL
}
[3]=>
array(3) {
[0]=>
NULL
[1]=>
string(3) "2-4"
[2]=>
NULL
}
}
然后,我们需要 "flatten" 数组,将所有子数组连接在一起。
这是使用 array_merge
实现的,但它不接受数组,因此我们使用 call_user_func_array
将数组提供给它的参数。
然后 array_filter
删除空值(由 array_map
引入,因为原始参数长度不同)。
我有 3 到 10 个数组,每个数组包含 20 到 50 个值。
我想将它们合并到一个数组中,但不是 array_merge
的工作方式。
我宁愿取第一个数组的第一个值,然后是第二个数组的第一个值,然后是第三个数组的第一个值,依此类推。
键在这里不是问题,它可以是数字或关联数组,我只是保留值,而不是原始键。
实际应用中的值可以混合,因此不能在之后进行合并和排序。
所以如果我有 3 个这样的数组:
$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4');
$array3=array('3-1','3-2');
我需要结果是一个包含以下顺序值的数组:
1-1, 2-1, 3-1, 1-2, 2-2, 3-2, 1-3, 2-3, 2-4
到目前为止,我有这段代码:
$array=array($array1,$array2,$array3);
$newarray=array();
foreach($array as $a){
$v=array_shift($a);
if(isset($v)){
$newarray[]=$v;
}
}
print_r($newarray);
但是,当然,它只运行第一组值并给我:
Array ( [0] => 1-1 [1] => 2-1 [2] => 3-1 )
array_shift
是我在这里需要的,因为它从旧数组中删除了值(我不再需要它了)并将它移动到新数组(如果它 isset
)。参见:http://php.net/manual/en/function.array-shift.php
我很确定我需要一个函数并循环它直到所有数组都为空,但我就是无法理解这个函数。任何帮助将不胜感激。如果有人知道执行此操作的本机 php 函数,甚至更好。
您可以使用 + 运算符。
$c = $a + $b
祝你好运!
试试这个代码
$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4');
$array3=array('3-1','3-2');
$array=array($array1,$array2,$array3);
$array2 = $array ;
function cmp($a, $b){
return (count($b) - count($a));
}
usort($array2, 'cmp');
$xax_length = count($array2[0]);
$newarray=array();
for($i=0;$i<$xax_length;$i++) {
foreach($array as &$a){
$v=array_shift($a);
if(isset($v)){
$newarray[]=$v;
}
}
}
print_r($newarray);
我建议在 for
循环中散列所有数组。
$array1=array('1-1','1-2','1-3');
$array2=array('2-1','2-2','2-3','2-4','2-5');
$array3=array('3-1','3-2');
$maxSize=max(count($array1),count($array2),count($array3));
$array=array($array1,$array2,$array3);
$newarray=array();
for ($i = 0; $i < $maxSize; $i++) {
for ($x = 0; $x < count($array); $x++) {
if(count($array[$x]) > $i){
$newarray[] = $array[$x][$i];
}
}
}
print_r($newarray);
仅供参考,如果你是运行 PHP 5.6+,你可以利用the new ...
operator to signify n number of arguments in a function declaration and/or call. Implementation would be something like this (reference):
function merge_vertical(...$arrays) {
return array_filter(array_merge(...array_map(null, ...$arrays)));
}
print_r(merge_vertical($array1, $array2, $array3));
Array
(
[0] => 1-1
[1] => 2-1
[2] => 3-1
[3] => 1-2
[4] => 2-2
[5] => 3-2
[6] => 1-3
[7] => 2-3
[10] => 2-4
)
这是一个简单的单行...
$arr1 = ['1-1', '1-2', '1-3'];
$arr2 = ['2-1', '2-2', '2-3', '2-4'];
$arr3 = ['3-1', '3-2'];
$result = array_filter(call_user_func_array(array_merge, array_map(null, $arr1, $arr2, $arr3)));
所以,也许不是那么简单...一些解释。
array_map(null, ...);
利用 PHP docs 示例 4 中解释的 array_map
的特性,但没有对值进行任何转换(因此为空)。
所以,这会给你:
array(4) {
[0]=>
array(3) {
[0]=>
string(3) "1-1"
[1]=>
string(3) "2-1"
[2]=>
string(3) "3-1"
}
[1]=>
array(3) {
[0]=>
string(3) "1-2"
[1]=>
string(3) "2-2"
[2]=>
string(3) "3-2"
}
[2]=>
array(3) {
[0]=>
string(3) "1-3"
[1]=>
string(3) "2-3"
[2]=>
NULL
}
[3]=>
array(3) {
[0]=>
NULL
[1]=>
string(3) "2-4"
[2]=>
NULL
}
}
然后,我们需要 "flatten" 数组,将所有子数组连接在一起。
这是使用 array_merge
实现的,但它不接受数组,因此我们使用 call_user_func_array
将数组提供给它的参数。
然后 array_filter
删除空值(由 array_map
引入,因为原始参数长度不同)。