转置和展平二维索引数组,其中行可能不等长
Posted
技术标签:
【中文标题】转置和展平二维索引数组,其中行可能不等长【英文标题】:Transpose and flatten two-dimensional indexed array where rows may not be of equal length 【发布时间】:2014-10-29 10:11:06 【问题描述】:我想取一个这样的数组并将它组合成一个单独的数组。
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 一起使用。另外,从我的示例中可以看出,元素很可能不匹配。
有谁知道实现这一点的最佳方法?
【问题讨论】:
数组键会匹配还是完全随机?例如[1,'a',3,'c']
和[17 => 2, 9 => 'b']
?结果索引必须是顺序的吗?初始键到底是什么意思?看起来您想要转置一个人口稀少的矩阵(切换列和行)。
我建议至少先尝试一下,而不是直接要求代码
@Keith:这有帮助吗? ***.com/questions/797251/…
【参考方案1】:
$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);
【讨论】:
这个答案缺少教育解释。由于array_filter()
的默认行为,它也不是零安全的。【参考方案2】:
我玩得很开心......所以如果你喜欢它,请使用它!
$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;
【讨论】:
还测试了更长的第二个字符串$arr2 = ['2','b',12,3123,2191,22,11,'a'];
请注意,它是可变数量的多维数组,而不是两个数组。
是的...实际上我只是意识到,因为我没有注意。我去看看能不能修好。但如果有人提交的东西比我好,我可能仍然会修复我的!
所以因为@Don'tPanic 基本上完成了我对我的解决方案所做的事情,而无需我对其进行太多更改,我将保留它。我不想偷他的。目前我想不出任何比我上面的任何一种解决方案更好的方法。
这个答案缺少教育解释。由于empty()
的默认行为,它也不是零安全的。【参考方案3】:
试图想出一个有趣的解决方案:
$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);
但它会破坏原始数组。
【讨论】:
这个答案缺少教育解释。【参考方案4】:确定哪一行包含的元素最多后,您可以遍历已知索引并将数据列推送到结果数组中。
以下技术可以安全地用于可变数量的行。
代码:(Demo)
$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'] |
附言对于任何因为他们的 php 版本而遇到技术限制的人,这将做同样的事情:
$maxCount = max(array_map('count', $array));
$result = [];
for ($i = 0; $i < $maxCount; ++$i)
foreach (array_column($array, $i) as $found)
$result[] = $found;
...如果你的 php 版本不支持上述 sn-p,你真的,真的需要升级你的 php 版本(对不起,不抱歉)。
【讨论】:
以上是关于转置和展平二维索引数组,其中行可能不等长的主要内容,如果未能解决你的问题,请参考以下文章