PHP:给定一个多维数组将其转换为单维排序,排序

时间:2016-05-20 22:44:22

标签: php arrays multidimensional-array

基本上,我想转换下面的多维数组:

Array
(

[0] => Array
    (
        [0] => foo
        [1] => bar
        [2] => hello
    )

[1] => Array
    (
        [0] => world
        [1] => love
    )

[2] => Array
    (
        [0] => stack
        [1] => overflow
        [2] => yep
        [3] => man
    )
)

进入这个:

Array
(
  [0] => foo
  [1] => world
  [2] => stack
  [3] => bar
  [4] => love
  [5] => overflow
  [6] => hello
  [7] => yep
  [8] => man
)
  1. 第一个子阵列的第一个元素
  2. 来自第二个子阵列的第一个元素等
  3. 第一个子阵列的第二个元素
  4. 来自第二个子阵列的第二个元素等......

2 个答案:

答案 0 :(得分:1)

所以我有几杯啤酒,我会稍后尝试收紧它,但这对整数索引数组起了作用:

$result = array();

for($i=0; $c=array_column($array, $i); $i++) {
    $result = array_merge($result, $c);
}
print_r($result);
  • 循环获取以第0列开头的列数组并增加列号。
  • 只要有列,获取该列的数组并与结果合并。

答案 1 :(得分:0)

有一个经常被忽视的迭代器可以帮助你:MultipleIterator。

我创建了一些演示代码:https://3v4l.org/beOMV

<?php

$arr = [
    0 => [
        0 => 'foo',
        1 => 'bar',
        2 => 'hello',
    ],
    1 => [
        0 => 'world',
        1 => 'love',
    ],
    2 => [
        0 => 'stack',
        1 => 'overflow',
        2 => 'yep',
        3 => 'man',
    ]
];

$parallelIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ANY|MultipleIterator::MIT_KEYS_NUMERIC);

$parallelIterator->attachIterator(new ArrayIterator($arr[0]));
$parallelIterator->attachIterator(new ArrayIterator($arr[1]));
$parallelIterator->attachIterator(new ArrayIterator($arr[2]));

$result = [];

foreach ($parallelIterator as $values) {
    foreach ($values as $value) {
        if ($value !== null) {
            $result[] = $value;
        }
    }    
}

var_dump($result);

本质上,遍历MultipleIterator将为您提供一个数组,其中包含并行的所有附加迭代器的所有第一个条目(然后是第二个,依此类推)。通过使用MultipleIterator::MIT_NEED_ANYMultipleIterator::MIT_NEED_ALL,您可以确定循环应该在最后一个迭代器没有更多元素时停止,或者在第一个迭代器用完元素时停止。当你运行到最后一个迭代器的最后一个元素时,你会得到NULL。

当附加迭代器时,你也可以添加一个在迭代时将在数组中使用的键,并且必须使用MultipleIterator::MIT_KEYS_ASSOC - 我在这里只使用数字索引,因为特定数组的源不是很有趣

结果是

array(9) { 
    [0]=> string(3) "foo" 
    [1]=> string(5) "world" 
    [2]=> string(5) "stack" 
    [3]=> string(3) "bar" 
    [4]=> string(4) "love" 
    [5]=> string(8) "overflow" 
    [6]=> string(5) "hello" 
    [7]=> string(3) "yep" 
    [8]=> string(3) "man" 
}

是的,如果需要,可以在将子数组附加到MultipleIterator时迭代该初始数组:

foreach ($arr as $innerArr) {
    $parallelIterator->attachIterator(new ArrayIterator($innerArr));
}