如何在多维数组中转置和内爆子数组数据以创建平面输出数组?
How to transpose and implode subarray data within a multidimensional array to create a flat output array?
我没有指定数量的子数组,但我的数据结构可以如下所示:
array(("john","alex","tyler"),("1","2","3"),("brown","yellow","green"));
上面的例子有 3 个子数组,但问题是这个数字可以改变。
在这个例子中,我需要一个包含 3 个字符串的数组作为最终输出。
array("john,1,brown","alex,2,yellow","tyler,3,green");
我试过用函数来写这个,但找不到解决方案。
使用call_user_func_array
、array_map
和array_merge
函数的解决方案:
$arr = [["john","alex","tyler"],["1","2","3"],["brown","yellow","green"]];
$groups = call_user_func_array("array_map", array_merge([null], $arr));
$result = array_map(function ($v) {
return implode(",", $v);
}, $groups);
print_r($result);
输出:
Array
(
[0] => john,1,brown
[1] => alex,2,yellow
[2] => tyler,3,green
)
在这里,我们通过将数组行转换为列来更改数组的值。然后用逗号(,
)内爆每个数组示例:array[1][0]
将变为 array[0][1]
等
<?php
$array=array(
array("john","alex","tyler"),
array("1","2","3"),
array("brown","yellow","green")
);
$result=array();
for($x=0;$x<count($array);$x++)
{
for($y=0;$y<count($array[$x]);$y++)
{
$result[$x][$y]=$array[$y][$x];//changing array values
}
}
foreach($result as $key => $value)
{
$result[$key]= implode(",", $value);//combining array values on comma(,)
}
print_r($result);
输出:
Array
(
[0] => john,1,brown
[1] => alex,2,yellow
[2] => tyler,3,green
)
更简单的方法使用 argument unpacking (php 5.6+)
<?php
$array = array(array("john","alex","tyler"),array("1","2","3"),array("brown","yellow","green"));
$result = array_map(function(...$elements) { return implode(",", $elements); }, ...$array);
print_r($result);
与其他回复相同的结果。
下面是更详细的内容:
array_map(/* anonymomous function */, ...$array);
...$array
获取嵌套数组并将其解包,就像调用
array_map(/* anonymomous function */, $array[0], $array[1], ... $array[n])
array_map 可能采用多个数组并将给定的可调用对象应用于每一轮。
而匿名函数或多或少做了相反的事情
function(...$elements) { return implode(",", $elements); }
...$elements
接受任意数量的参数并将它们变成一个数组,然后将其连接成一个字符串。
@ultradurable3 这也可以做到 array_column() 在这里你不必担心子阵列的数量,尝试如下:
<?php
$array = array(array("john","alex","tyler"), array("1","2","3"), array("brown","yellow","green"));
$finalArr = array(implode(",", array_column($array, 0)), implode(",", array_column($array, 1)), implode(",", array_column($array, 2)));
echo "<pre>";
print_r($finalArr);
我没有指定数量的子数组,但我的数据结构可以如下所示:
array(("john","alex","tyler"),("1","2","3"),("brown","yellow","green"));
上面的例子有 3 个子数组,但问题是这个数字可以改变。
在这个例子中,我需要一个包含 3 个字符串的数组作为最终输出。
array("john,1,brown","alex,2,yellow","tyler,3,green");
我试过用函数来写这个,但找不到解决方案。
使用call_user_func_array
、array_map
和array_merge
函数的解决方案:
$arr = [["john","alex","tyler"],["1","2","3"],["brown","yellow","green"]];
$groups = call_user_func_array("array_map", array_merge([null], $arr));
$result = array_map(function ($v) {
return implode(",", $v);
}, $groups);
print_r($result);
输出:
Array
(
[0] => john,1,brown
[1] => alex,2,yellow
[2] => tyler,3,green
)
在这里,我们通过将数组行转换为列来更改数组的值。然后用逗号(,
)内爆每个数组示例:array[1][0]
将变为 array[0][1]
等
<?php
$array=array(
array("john","alex","tyler"),
array("1","2","3"),
array("brown","yellow","green")
);
$result=array();
for($x=0;$x<count($array);$x++)
{
for($y=0;$y<count($array[$x]);$y++)
{
$result[$x][$y]=$array[$y][$x];//changing array values
}
}
foreach($result as $key => $value)
{
$result[$key]= implode(",", $value);//combining array values on comma(,)
}
print_r($result);
输出:
Array
(
[0] => john,1,brown
[1] => alex,2,yellow
[2] => tyler,3,green
)
更简单的方法使用 argument unpacking (php 5.6+)
<?php
$array = array(array("john","alex","tyler"),array("1","2","3"),array("brown","yellow","green"));
$result = array_map(function(...$elements) { return implode(",", $elements); }, ...$array);
print_r($result);
与其他回复相同的结果。
下面是更详细的内容:
array_map(/* anonymomous function */, ...$array);
...$array
获取嵌套数组并将其解包,就像调用
array_map(/* anonymomous function */, $array[0], $array[1], ... $array[n])
array_map 可能采用多个数组并将给定的可调用对象应用于每一轮。
而匿名函数或多或少做了相反的事情
function(...$elements) { return implode(",", $elements); }
...$elements
接受任意数量的参数并将它们变成一个数组,然后将其连接成一个字符串。
@ultradurable3 这也可以做到 array_column() 在这里你不必担心子阵列的数量,尝试如下:
<?php
$array = array(array("john","alex","tyler"), array("1","2","3"), array("brown","yellow","green"));
$finalArr = array(implode(",", array_column($array, 0)), implode(",", array_column($array, 1)), implode(",", array_column($array, 2)));
echo "<pre>";
print_r($finalArr);