如何通过删除空值 compact/rearrange 一个 multi-dimensional 数组
How to compact/rearrange a multi-dimensional array by removing null values
我有一个名为 $rows
的数组。第一行是 header。
第一列为X
(输入信号),其他列为Y1
、Y2
、Y3
等(输出信号)。
对于任何 X
值,某些 Y
值可能是 NULL
。
我用这个代码打印它:
$first_key = key($rows);
foreach ($rows as $key => $row) {
if($key == $first_key) { // print header
fputcsv($out, array_keys($row));
}
fputcsv($out, $row);
}
此代码的输出如下所示(按 X
列排序):
X | Y1 | Y2 | Y3 |
--------------------------
0.1 | | 10 | |
0.5 | 90 | | 7 |
0.7 | 15 | 40 | |
1.2 | | 12 | |
目标:重组输出以包含 X1
、Y1
、X2
、Y2
等列,这样在每一对中 (Xi
,Yi
) 行数据和 header 之间没有 NULL
(空)值:
X1 | Y1 | X2 | Y2 | X3 | Y3 |
------------------------------------------
0.5 | 90 | 0.1 | 10 | 0.5| 7 |
0.7 | 15 | 0.7 | 40 | | |
| | 1.2 | 12 | | |
我的尝试:
$current_header = array_keys($rows[0]);
$size = count($current_header);
$new_header=array(); // the new header: X1, Y1, X2, Y2,...
$arr_X=array();
$arr_Y=array();
$x_column=$current_header[0];
for ($i=1; $i<$size; $i++) {
$y_column=$current_header[$i];
$new_header[2*$i] = $x_column;
$new_header[2*$i+1] = $y_column;
$arr_Y[$y_column] = array_column($rows, $y_column);
$arr_X[$y_column] = array_column($rows, $x_column);
}
下一步:将 $arr_X[$y_column]
和 $arr_Y[$y_column]
加入 arr_XY
。我认为在这个数组中,键应该是索引(row#);另外 arr_XY
不应该包括 $arr_Y[$y_column]
是 NULL
的点:我不知道该怎么做
$arr_XY=array();
for ($i=1; $i<$size; $i++) {
$y_column=$current_header[$i];
// here should be the code to join arrays and eliminate NULL arr_Y points
$arr_XY[$y_column] = ($arr_X[$y_column], $arr_Y[$y_column]);
}
最后一步是我需要帮助的地方:通过按行索引组合所有 arr_XY[$y_column]
来构建和打印输出行。
这就是你想要的吗?
输入:
$rows=[
['X','Y1','Y2','Y3'],
[.1,null,10,null],
[.5,90,null,7],
[.7,15,40,null],
[1.2,null,12,null]
];
方法:
foreach($rows as $i=>$row){
if(!isset($result)){ // prepare result keys in order
foreach(array_slice($row,1) as $col){ // don't iterate X column of header
$no=substr($col,1); // get number following Y
$result["X$no"]=[]; // declare X column with column integer
$result["Y$no"]=[]; // declare Y column with column integer
}
}else{
foreach(array_slice($row,1,null,true) as $i=>$col){ // ignore X column
if(!is_null($col)){ // only store non-null values
$result["X$i"][]=$row[0]; // assign X value
$result["Y$i"][]=$col; // assign Y value
}
}
}
}
var_export($result);
替代方法:
foreach($rows as $i=>$row){
foreach(array_slice($row,1,null,true) as $c=>$col){
if($i==0){
$result["X$c"]=[];
$result["Y$c"]=[];
}elseif(!is_null($col)){
$result["X$c"][]=$row[0];
$result["Y$c"][]=$col;
}
}
}
输出:
array (
'X1' => [0.5, 0.7],
'Y1' => [90, 15],
'X2' => [0.1, 0.7, 1.2],
'Y2' => [10, 40, 12],
'X3' => [0.5],
'Y3' => [7]
];
我有一个名为 $rows
的数组。第一行是 header。
第一列为X
(输入信号),其他列为Y1
、Y2
、Y3
等(输出信号)。
对于任何 X
值,某些 Y
值可能是 NULL
。
我用这个代码打印它:
$first_key = key($rows);
foreach ($rows as $key => $row) {
if($key == $first_key) { // print header
fputcsv($out, array_keys($row));
}
fputcsv($out, $row);
}
此代码的输出如下所示(按 X
列排序):
X | Y1 | Y2 | Y3 |
--------------------------
0.1 | | 10 | |
0.5 | 90 | | 7 |
0.7 | 15 | 40 | |
1.2 | | 12 | |
目标:重组输出以包含 X1
、Y1
、X2
、Y2
等列,这样在每一对中 (Xi
,Yi
) 行数据和 header 之间没有 NULL
(空)值:
X1 | Y1 | X2 | Y2 | X3 | Y3 |
------------------------------------------
0.5 | 90 | 0.1 | 10 | 0.5| 7 |
0.7 | 15 | 0.7 | 40 | | |
| | 1.2 | 12 | | |
我的尝试:
$current_header = array_keys($rows[0]);
$size = count($current_header);
$new_header=array(); // the new header: X1, Y1, X2, Y2,...
$arr_X=array();
$arr_Y=array();
$x_column=$current_header[0];
for ($i=1; $i<$size; $i++) {
$y_column=$current_header[$i];
$new_header[2*$i] = $x_column;
$new_header[2*$i+1] = $y_column;
$arr_Y[$y_column] = array_column($rows, $y_column);
$arr_X[$y_column] = array_column($rows, $x_column);
}
下一步:将 $arr_X[$y_column]
和 $arr_Y[$y_column]
加入 arr_XY
。我认为在这个数组中,键应该是索引(row#);另外 arr_XY
不应该包括 $arr_Y[$y_column]
是 NULL
的点:我不知道该怎么做
$arr_XY=array();
for ($i=1; $i<$size; $i++) {
$y_column=$current_header[$i];
// here should be the code to join arrays and eliminate NULL arr_Y points
$arr_XY[$y_column] = ($arr_X[$y_column], $arr_Y[$y_column]);
}
最后一步是我需要帮助的地方:通过按行索引组合所有 arr_XY[$y_column]
来构建和打印输出行。
这就是你想要的吗?
输入:
$rows=[
['X','Y1','Y2','Y3'],
[.1,null,10,null],
[.5,90,null,7],
[.7,15,40,null],
[1.2,null,12,null]
];
方法:
foreach($rows as $i=>$row){
if(!isset($result)){ // prepare result keys in order
foreach(array_slice($row,1) as $col){ // don't iterate X column of header
$no=substr($col,1); // get number following Y
$result["X$no"]=[]; // declare X column with column integer
$result["Y$no"]=[]; // declare Y column with column integer
}
}else{
foreach(array_slice($row,1,null,true) as $i=>$col){ // ignore X column
if(!is_null($col)){ // only store non-null values
$result["X$i"][]=$row[0]; // assign X value
$result["Y$i"][]=$col; // assign Y value
}
}
}
}
var_export($result);
替代方法:
foreach($rows as $i=>$row){
foreach(array_slice($row,1,null,true) as $c=>$col){
if($i==0){
$result["X$c"]=[];
$result["Y$c"]=[];
}elseif(!is_null($col)){
$result["X$c"][]=$row[0];
$result["Y$c"][]=$col;
}
}
}
输出:
array (
'X1' => [0.5, 0.7],
'Y1' => [90, 15],
'X2' => [0.1, 0.7, 1.2],
'Y2' => [10, 40, 12],
'X3' => [0.5],
'Y3' => [7]
];