我有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函数就更好了。
发布于 2015-07-13 05:12:22
这是一个简单的单线.
$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, ...);使用了array_map在PHP文档示例4中解释的特性,但没有对值进行任何转换(因此为null)。
所以,这会给你:
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
}
}然后,我们需要“扁平”数组,将所有子数组连接在一起。这是使用array_merge实现的,但不需要数组,所以我们使用call_user_func_array将数组输入到它的参数中。
然后,array_filter移除空(由array_map引入,因为原始参数不是相同的长度)。
发布于 2015-07-13 05:06:26
如果您正在运行PHP,您可以利用5.6+来表示函数声明和/或调用中的n个参数。实现如下所示(参考文献):
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
)发布于 2015-07-13 04:56:02
试试这段代码
$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);https://stackoverflow.com/questions/31375323
复制相似问题