[英]Transpose and flatten two-dimensional indexed array where rows may not be of equal length
我想采用這樣的數組並將其組合成 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 一起使用。此外,正如您從我的示例中看到的最有可能的元素數量不會匹配。
任何人都知道實現這一目標的最佳方法?
$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 = [
["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);
它會破壞原始數組。
我對此很開心...所以,如果您喜歡它,請使用它!
$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;
}
在確定哪一行包含最多元素后,您可以遍歷已知索引並將數據列推送到結果數組中。
以下技術可以安全地用於可變數量的行。
代碼:(演示)
$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'] |
上述技術也完全能夠容納 3 個或更多輸入 arrays 。
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 版本(抱歉,不抱歉)。
為了避免計數以確定最長的子數組,您可以使用嵌套循環轉置數據,然后展平該結果結構。 (演示)
$result = [];
foreach ($array as $i => $row) {
foreach ($row as $k => $v) {
$result[$k][$i] = $v;
}
}
var_export(array_merge(...$result));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.