2

我想采用这样的数组并将其组合成 1 个单个数组。

array (size=2)
   0 => 
      array (size=10)
         0 => string '1' 
         1 => string 'a' 
         2 => string '3' 
         3 => string 'c' 
   1 => 
      array (size=5)
         0 => string '2'
         1 => string 'b'

但是我希望数组结果交错。

所以它最终看起来像

array
     0 => '1'
     1 => '2'
     2 => 'a'
     3 => 'b'
     4 => '3'
     5 => 'c'

我想要它,这样不管传入多少初始键(这个有 2 个),它应该与 1、2 或 5 一起使用。此外,正如您从我的示例中看到的最有可能的元素数量不会匹配。

任何人都知道实现这一目标的最佳方法?

4

4 回答 4

5
$data = array(
    0 => array(
        0 => '1',
        1 => 'a',
        2 => '3',
        3 => 'c',
    ),
    1 => array(
        0 => '2',
        1 => 'b',
    ),
);

$newArray = array();
$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ANY);
$mi->attachIterator(new ArrayIterator($data[0]));
$mi->attachIterator(new ArrayIterator($data[1]));
foreach($mi as $details) {
    $newArray = array_merge(
        $newArray,
        array_filter($details)
    );
}
var_dump($newArray);
于 2014-09-04T15:33:17.187 回答
0

试图想一个有趣的解决方案:

$array = [
    ["a","b","c"],
    ["d","e"]
];
$result = [];
while($array) { 
    array_walk(
        $array, 
        function(&$subarray, $key) use (&$array, &$result) { 
            $result[] = array_shift($subarray); 
            if(empty($subarray)) unset ($array[$key]); 
        }
    );
}

var_dump($result);

它虽然破坏了原始数组。

于 2014-09-04T15:27:32.117 回答
0

我玩得很开心......所以如果你喜欢它,请使用它!

$arr1 = [1,'a',3,'c'];
$arr2 = ['2','b'];

$finarry = arrayInterweave($arr1,$arr2);
print_r($finarry);

function arrayInterweave($arr1,$arr2){
  $count1 = count($arr1);
  $count2 = count($arr2);
  $length = (($count1 >= $count2) ? $count1 : $count2);

  $fin = array();
  for($i = 0;$i<$length;$i++){
      if(!empty($arr1[$i])){
        $fin[] = $arr1[$i];
      }
      if(!empty($arr2[$i])){
        $fin[] = $arr2[$i];
      }
  }
  return $fin;
}
于 2014-09-04T15:34:42.747 回答
0

在确定哪一行包含最多元素后,您可以遍历已知索引并将数据列推送到结果数组中。

以下技术可以安全地用于可变数量的行。

代码:(演示

$maxCount = max(array_map('count', $array));
$result = [];
for ($i = 0; $i < $maxCount; ++$i) {
    array_push($result, ...array_column($array, $i));
}
var_export($result);

输入输出:

$array $result
[['b', 'e', 'd', 's'], ['l', 'n']] ['b', 'l', 'e', 'n', 'd', 's']
['f', 'g', 'n', 's'], ['r', 'm'], ['a', 'e', 't'] ['f', 'r', 'a', 'g', 'm', 'e', 'n', 't' 's']

ps 对于任何因为他们的 php 版本而遇到技术限制的人,这将做同样的事情:

$maxCount = max(array_map('count', $array));
$result = [];
for ($i = 0; $i < $maxCount; ++$i) {
    foreach (array_column($array, $i) as $found) {
        $result[] = $found;
    }
}

...如果您的 php 版本不支持上述代码段,您真的,真的需要升级您的 php 版本(抱歉,不抱歉)。

于 2021-08-29T22:38:16.173 回答