2011-09-30 8 views
1

csv 파일에서 다차원 배열을 생성하는 데 문제가 있습니다. 각 국가마다 여러 네트워크가있을 수 있으므로 국가별로 '그룹화'된 결과물을 가져야합니다. 일부 행은 위에있는 행과 관련된 국가 또는 지역 값을 갖지 않습니다. 불행히도 이것은 어떻게 CSV 파일을 수신하고 출력을 변경할 수있는 방법이 없습니다. 모든 의견이나 포인터를 부탁드립니다. CSV 파일의csv에서 다차원 배열 만들기

발췌문 ...

Country|Zone|Network|Video|Voice 
Afghanistan,5,Afghan Wireless,No,Yes 
,,Roshan,No,Yes 
Antigua,4,Digicel,No,Yes 
Argentina,5,Telecom Personal,Yes,Yes 
,,Movistar,No,Yes 
,,Movistar2,Yes,Yes 
Aruba,4,Digicel,No 

이상적인 출력

Array (
    [0] => Array (
     [country] => Afghanistan 
     [zone] => 5 
     [network] => Array (
      [0] => Array (
       [name] => Afghan Wireless 
       [video] => No 
       [voice] => Yes 
      ) 
      [1] => Array (
       [name] => Roshan 
       [video] => No 
       [voice] => Yes 
      ) 
     ) 
    ) 
    [1] => Array (
     [country] => Antigua 
     [zone] => 4 
     [network] => Array (
      [0] => Array (
       [name] => Digicell 
       [video] => No 
       [voice] => Yes 
      ) 
     ) 
    ) 
    etc... 
) 

답변

2
<?php 

$csvArray=array();//to store final data 
$networkArray=array();//to serve as temporar buffer 

if (($handle = fopen("file.csv", "r")) !== FALSE) 
{ 
    fgetcsv($handle, 1000, ",");//skip the first line cause contains labels only 
    //iterate all ther line 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
    { 
     //if a new country 
     if($data[0]!=='') 
     { 
      /*get last key assigned to the previous country*/ 
      $key=array_pop(array_keys($csvArray)); 
      /*store the buffer, at the very begining no last country exists 
      so this network will be stored in a null key, will delete it later*/ 
      $csvArray[$key]['network']=$networkArray; 
      //emty the buffer 
      $networkArray=array(); 
      //now we are done with previous country and will store the new one 
      $csvArray[]=Array('country'=>$data[0],'zone'=>$data[1]);   
     }//@if ends 
      //Put to buffer network, video and voice 
      $networkArray[]=Array('name'=>$data[2],'video'=>$data[3],'voice'=>$data[4]);  
    }//@while ends 
    fclose($handle); 
}//@outer if ends 

//store the last network buffer 
$key=array_pop(array_keys($csvArray)); 
$csvArray[$key]['network']=$networkArray; 
//delete the null key set in the begining 
array_shift($csvArray); 

//show the array 
echo '<pre>'; 
print_r($csvArray); 

?> 
(하나를 완료 테스트 전자되지 않음)3210
+0

대단히 감사합니다. 그리고 배열과 루프에 대해서도 조금 더 배웠습니다. – Jamie

0

그냥 간단한 솔루션

<?php 

// Initialize the final result 
$result = array(); 

// Read the file line by line 
$handle = @fopen("test.csv", "r"); 
if ($handle) { 
    $country = null; 

    while (($buffer = fgets($handle, 4096)) !== false) { 

     $line = explode(',', $buffer); 

     if($line[0] == null) { 

      $network['name'] = $line[2]; 
      $network['video'] = $line[3]; 
      if(isset($line[4])) $network['voice'] = $line[4]; 

      $country['network'][] = $network; 

      $network = null; 

     } else { 
      if($country != null) { 
       $result[] = $country; 
       $country = null; 
      } 

      $country['country'] = $line[0]; 
      $country['zone'] = $line[1]; 

      $network['name'] = $line[2]; 
      $network['video'] = $line[3]; 
      if(isset($line[4])) $network['voice'] = $line[4]; 

      $country['network'][] = $network; 

      $network = null; 

     } 

    } 
    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 
    fclose($handle); 

    print_r($result); 
}