如何重构以列为行的多维数组?
How to restructure multi-dimensional array with columns as rows?
有没有一种有效的方法来改变这个多维数组的结构?我想对列值进行分组。
//$arrayBefore
[[5, 4, 10], [11, 13, 15], [32, 14, 15]];
想要的结果:
//$arrayAfter
[[5, 11, 32], [4, 13, 14], [10, 15, 15]];
可以根据array_column():-
<?php
$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];
$final_array = [array_column($array,0),array_column($array,1),array_column($array,2)];
print_r($final_array );
注意:- 以上代码仅适用于此数组。
更一般和考虑所有方面代码使用 foreach()
:-
<?php
$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];
$final_array = array();
foreach($array as $arr){
foreach($arr as $key=>$value){
$final_array[$key][]=$value;
}
}
print_r($final_array);
<?php
$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];
for($i = 0; $i < count($array); $i++) {
for ($j = 0; $j < count($array[$i]); $j++) {
$temp[$j][] = $array[$i][$j];
}
}
print_r($temp);
如果不确定数组结构,也可以使用foreach。将在每个数组中工作超过 3 个而无需任何代码修改
<?
$arr = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];
foreach($arr as $value_arr){
$i=0;
foreach($value_arr as $value){
if ($value){
$arr2[$i][]=$value;
$i++;
}
}
}
echo "<pre>";
print_r($arr2);
echo "</pre>";
?>
Array
(
[0] => Array
(
[0] => 5
[1] => 11
[2] => 32
)
[1] => Array
(
[0] => 4
[1] => 13
[2] => 14
)
[2] => Array
(
[0] => 10
[1] => 15
[2] => 15
)
)
我已经因为 SO 提倡针对此类问题的可变参数方法而受到嘲笑,但我认为重要的是要展示 php 的聪明开发人员为编码人员提供的功能。
...
(splat 运算符)告诉 array_map()
多维(子数组数量可能可变)数组即将到来。然后该函数同步迭代每个单独的子数组。
在下面的代码中,我注释掉了array_map()
使用的静态命名参数$v1
、$v2
、$v3
的方法。这将适用于 OP 的案例。
评论代码后面的代码行是一种动态访问值而无需进行任何变量命名的方法。对于多维数组的结构更改其 size/shape.
的任何情况,这也将非常灵活
PHP 手册参考:
单线(需要PHP5.6+):(Demo with additional examples/considerations)
$m_array=[[5, 4, 10], [11, 13, 15], [32, 14, 15]];
//$new=array_map(function($v1,$v2,$v3){return [$v1,$v2,$v3];},...$m_array);
$new=array_map(function(){return func_get_args();},...$m_array);
var_export($new);
输出:
array (
0 =>
array (
0 => 5,
1 => 11,
2 => 32,
),
1 =>
array (
0 => 4,
1 => 13,
2 => 14,
),
2 =>
array (
0 => 10,
1 => 15,
2 => 15,
),
)
有没有一种有效的方法来改变这个多维数组的结构?我想对列值进行分组。
//$arrayBefore
[[5, 4, 10], [11, 13, 15], [32, 14, 15]];
想要的结果:
//$arrayAfter
[[5, 11, 32], [4, 13, 14], [10, 15, 15]];
可以根据array_column():-
<?php
$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];
$final_array = [array_column($array,0),array_column($array,1),array_column($array,2)];
print_r($final_array );
注意:- 以上代码仅适用于此数组。
更一般和考虑所有方面代码使用 foreach()
:-
<?php
$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];
$final_array = array();
foreach($array as $arr){
foreach($arr as $key=>$value){
$final_array[$key][]=$value;
}
}
print_r($final_array);
<?php
$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];
for($i = 0; $i < count($array); $i++) {
for ($j = 0; $j < count($array[$i]); $j++) {
$temp[$j][] = $array[$i][$j];
}
}
print_r($temp);
如果不确定数组结构,也可以使用foreach。将在每个数组中工作超过 3 个而无需任何代码修改
<?
$arr = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];
foreach($arr as $value_arr){
$i=0;
foreach($value_arr as $value){
if ($value){
$arr2[$i][]=$value;
$i++;
}
}
}
echo "<pre>";
print_r($arr2);
echo "</pre>";
?>
Array
(
[0] => Array
(
[0] => 5
[1] => 11
[2] => 32
)
[1] => Array
(
[0] => 4
[1] => 13
[2] => 14
)
[2] => Array
(
[0] => 10
[1] => 15
[2] => 15
)
)
我已经因为 SO 提倡针对此类问题的可变参数方法而受到嘲笑,但我认为重要的是要展示 php 的聪明开发人员为编码人员提供的功能。
...
(splat 运算符)告诉 array_map()
多维(子数组数量可能可变)数组即将到来。然后该函数同步迭代每个单独的子数组。
在下面的代码中,我注释掉了array_map()
使用的静态命名参数$v1
、$v2
、$v3
的方法。这将适用于 OP 的案例。
评论代码后面的代码行是一种动态访问值而无需进行任何变量命名的方法。对于多维数组的结构更改其 size/shape.
的任何情况,这也将非常灵活PHP 手册参考:
单线(需要PHP5.6+):(Demo with additional examples/considerations)
$m_array=[[5, 4, 10], [11, 13, 15], [32, 14, 15]];
//$new=array_map(function($v1,$v2,$v3){return [$v1,$v2,$v3];},...$m_array);
$new=array_map(function(){return func_get_args();},...$m_array);
var_export($new);
输出:
array (
0 =>
array (
0 => 5,
1 => 11,
2 => 32,
),
1 =>
array (
0 => 4,
1 => 13,
2 => 14,
),
2 =>
array (
0 => 10,
1 => 15,
2 => 15,
),
)