2014-03-30 49 views
0

我想使用PHP循环和数组将多个值写入单个csv单元格。使用PHP循环和数组将多个值写入单个csv单元格

<?php 

$data = array 
(
3 => array 
    (
     'name' => 'Mars', 
     'type' => 'Terrestrial Planet', 
     'diameter' => 0.532, 
     'mass' => 0.11, 
     'rings' => 0, 
     'position' => 4, 
     'gases' => array 
      (
       0 => 'CO2', 
       1 => 'N2', 
       2 => 'Ar' 
      ), 

     'satellites' => array 
      (
       0 => array 
        (
         'name' => 'Phobos', 
         'radius' => 6.20 
        ), 

       1 => array 
        (
         'name' => 'Deimos', 
         'radius' => 6.20 
        ) 

      ) 

    ) 

); 

function writeCSV($array){ 

$str = []; 
$fp = fopen('file.csv', 'w'); 
fputcsv($fp, array('Name','Type','Diameter','Mass','Rings','Position','Gases','Satellite-Name','Satellite-Radius'),"\t"); 

foreach ($array as &$fields) { 

    $str[] = $fields['name']; 
    $str[] = $fields['type']; 
    $str[] = $fields['diameter']; 
    $str[] = $fields['mass']; 
    $str[] = $fields['rings']; 
    $str[] = $fields['position']; 

    if(is_array($fields['gases'])){ 
     foreach ($fields['gases'] as $gas) 
      array_push($str, $gas); 
    } 

    if(is_array($fields['satellites'])){ 

     foreach ($fields['satellites'] as $satellite) 
      $str[] = $satellite['name']; 

     foreach ($fields['satellites'] as $satellite) 
      $str[] = $satellite['radius']; 

    } 

    fputcsv($fp, $str); 
    $str = []; 

} 


} 

writeCSV($data); 

?> 

这样做的结果,写道:

Name Type Diameter Mass Rings Position Gases Satellite-Name Satellite-Radius 
Mercury,"Terrestrial Planet",0.382,0.06,0,1 
Venus,"Terrestrial Planet",0.949,0.82,0,2,CO2,N2 
Earth,"Terrestrial Planet",1,1,0,3,N2,O2,Ar,Moon,1737.1 
Mars,"Terrestrial Planet",0.532,0.11,0,4,CO2,N2,Ar,Phobos,Deimos,6.2,6.2 

到文件中。我真的需要它通过拦截卫星写入多个(气体,卫星名称卫星半径)值到一个空格分隔并用引号引用,说一个单细胞,即

Name Type Diameter Mass Rings Position Gases Satellite-Name Satellite-Radius 
Mercury,"Terrestrial Planet",0.382,0.06,0,1 
Venus,"Terrestrial Planet",0.949,0.82,0,2,"CO2 N2" 
Earth,"Terrestrial Planet",1,1,0,3,"N2 O2 Ar",Moon,1737.1 
Mars,"Terrestrial Planet",0.532,0.11,0,4,"CO2 N2 Ar","Phobos Deimos","6.2 6.2" 

我想这会发生,气体循环以某种方式,但我正在努力连接或增加气体和卫星循环,以获得数据到一个阵列单元值。

+0

首先将气体和卫星追加到单个字符串中,然后将它们推送到堆栈,即这些条目需要位于单个索引中(请参阅fputcsv文档,说明为什么当前实现出错)。 – pbond

回答

1

的气体很容易,而不是

foreach ($fields['gases'] as $gas) 
      array_push($str, $gas); 

使用

$str[] = join(' ', $fields['gases']); 

对于名称和半径的最简单的解决方案可能是array_column,只要(PHP 5 >= 5.5.0)是不是有问题?

$str[] = join(' ', array_column($fields['satellites'], 'name')); 
$str[] = join(' ', array_column($fields['satellites'], 'radius')); 

但是如果这些值中的任何一个可能包含空格(例如木星的moo ñS/2000 J 11)你必须先编码。

相关问题