2014-03-30 1 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']); 

의, 쉽고 간단한 솔루션은 한 (PHP 5 >= 5.5.0)이 문제가 아니므로, 아마 array_column입니다 반지름 ... .

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

하지만

는 이러한 값은 공백을 포함 할 수있는 경우 (예를 들어 목성의 무 n S/2000 J 11) 먼저 인코딩해야합니다.

관련 문제