如何通过删除空值来压缩/重新排列多维数组

时间:2017-05-16 19:51:46

标签: php arrays multidimensional-array filtering columnsorting

我有一个名为$rows的数组。第一行是标题。 第一列是X(输入信号),其他列是Y1Y2Y3等(输出信号)。 对于任何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  |    |

目标:重新组织输出以包含X1Y1X2Y2等列,以便在每对中Xi,{{1 }})行数据和标题之间没有Yi(空)值:

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也不应包含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]); } 来构建和打印输出行。

1 个答案:

答案 0 :(得分:1)

这就是你想要的吗?

输入:

$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]
];