2017-05-16 13 views
3

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

目标:

我用这个代码打印重组输出有列X1Y1X2,Y2等,使得在每一对(Xi,Yi)中没有NULL(空)值在行数据和第e报头:

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]合并打印输出行指数。

+1

为了完整起见,你可以发布一个(缩短的)你的数组的'var_dump'吗? – ccKep

+0

{[“X”] => float(0.1) [“Y1”] => NULL [“Y2”] => float(10.0) [“Y3”] => NULL } – user510040

回答

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] 
]; 
+0

是的,正是我正在寻找的!谢谢! – user510040