2011-11-11 28 views
5

我正在上傳一個csv文件,然後使用str_getcsv解析它。所有的作品都很棒,除了我需要一種方法來循環它們。理想情況下,這將會是巨大的,有陣回來,看起來像這樣:php str_getcsv數組問題

Array (  
    [1] => Array 
     (
      [0] => 1 // first id in csv 
      [1] => name 
      [2] => address 
      [3] => town 
      [4] => state 
      [5] => zip 
      [6] => phone 
      [7] => website 
      [8] => other 
      [9] => other 
     ) 
    [22] => Array 
     (
      [10] => name 
      [11] => address 
      [12] => town 
      [13] => state 
      [14] => zip 
      [15] => phone 
      [16] => website 
      [17] => other 
      [18] => other 
     ) 
    [24] => Array 
     (
      [19] => name 
      [20] => address 
      [21] => town 
      [22] => state 
      [23] => zip 
      [24] => phone 
      [25] => website 
      [26] => other 
      [27] => other 
     ) 
) 

然而,數據回來類似如下:

Array 
(
    [0] => 1 // first id in csv 
    [1] => name 
    [2] => address 
    [3] => town 
    [4] => state 
    [5] => zip 
    [6] => phone 
    [7] => website 
    [8] => other 
    [9] => other 
22 // id field 
    [10] => name 
    [11] => address 
    [12] => town 
    [13] => state 
    [14] => zip 
    [15] => phone 
    [16] => website 
    [17] => other 
    [18] => other 
24// id field 
    [19] => name 
    [20] => address 
    [21] => town 
    [22] => state 
    [23] => zip 
    [24] => phone 
    [25] => website 
    [26] => other 
    [27] => other 

關於如何解決此問題的任何建議看像頂部的數組? 現在我做:

$csvfile = file_get_contents($targetFile); 
$csv = str_getcsv($csvfile); 
+0

[PHP的CSV字符串數組]可能的重複(http://stackoverflow.com/questions/17761172/php-csv-string-to-array) – user

+0

我已經標記爲重複,儘管事實上這問題是早些時候,因爲這個問題更受歡迎 – user

回答

11

str_getcsv()預計作爲參數傳遞的字符串是一個記錄。
但由於你的源文件反正最簡單的方法可能是使用fgetcsv()代替str_getcsv()

$data = array(); 
$fp = fopen($targetFile, 'rb'); 
while(!feof($fp)) { 
    $data[] = fgetcsv($fp); 
} 
fclose($fp); 

自足例如:

<?php 
$targetFile = 'soTest.csv'; 
setup($targetFile); 

$data = array(); 
$fp = fopen($targetFile, 'rb'); 
while(!feof($fp)) { 
    $data[] = fgetcsv($fp); 
} 
var_dump($data); 


function setup($targetFile) { 
    file_put_contents($targetFile, <<< eot 
1,name,address,town,state,zip,phone,website,other,other 
2,name,address,town,state,zip,phone,website,other,other 
3,name,address,town,state,zip,phone,website,other,other 
eot 
    ); 
} 

打印

array(3) { 
    [0]=> 
    array(10) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(4) "name" 
    [2]=> 
    string(7) "address" 
    [3]=> 
    string(4) "town" 
    [4]=> 
    string(5) "state" 
    [5]=> 
    string(3) "zip" 
    [6]=> 
    string(5) "phone" 
    [7]=> 
    string(7) "website" 
    [8]=> 
    string(5) "other" 
    [9]=> 
    string(5) "other" 
    } 
    [1]=> 
    array(10) { 
    [0]=> 
    string(1) "2" 
    [1]=> 
    string(4) "name" 
    [2]=> 
    string(7) "address" 
    [3]=> 
    string(4) "town" 
    [4]=> 
    string(5) "state" 
    [5]=> 
    string(3) "zip" 
    [6]=> 
    string(5) "phone" 
    [7]=> 
    string(7) "website" 
    [8]=> 
    string(5) "other" 
    [9]=> 
    string(5) "other" 
    } 
    [2]=> 
    array(10) { 
    [0]=> 
    string(1) "3" 
    [1]=> 
    string(4) "name" 
    [2]=> 
    string(7) "address" 
    [3]=> 
    string(4) "town" 
    [4]=> 
    string(5) "state" 
    [5]=> 
    string(3) "zip" 
    [6]=> 
    string(5) "phone" 
    [7]=> 
    string(7) "website" 
    [8]=> 
    string(5) "other" 
    [9]=> 
    string(5) "other" 
    } 
} 

EDIT2:對於使用每個記錄的第一個元素作爲結果數組中的關鍵是:這個世界上

<?php 
$targetFile = 'soTest.csv'; 
setup($targetFile); 

$data = array(); 
$fp = fopen($targetFile, 'rb'); 
while(!feof($fp)) { 
    $row = fgetcsv($fp); 
    $id = array_shift($row); 
    $data[$id] = $row; 
} 
var_dump($data); 


function setup($targetFile) { 
    file_put_contents($targetFile, <<< eot 
1,name,address,town,state,zip,phone,website,other,other 
2,name,address,town,state,zip,phone,website,other,other 
3,name,address,town,state,zip,phone,website,other,other 
eot 
    ); 
} 
+0

這仍然爲我返回相同的東西。我需要它看起來像問題頂部的陣列 –

+0

@Drew:那麼也許你有一個問題,PHP沒有檢測到文件內的行尾。看到http://docs.php.net/filesystem.configuration#ini.auto-detect-line-endings – VolkerK

+0

它仍然沒有工作,但tHanks的幫助。 –

0

不是美眉的事情,但我認爲它的工作原理。代碼

//make the arrays needed 
$csvtmp = array(); 
$csvFinal = array(); 

$csvfile = file_get_contents('test.csv'); 
$csv = str_getcsv($csvfile,"\n"); //make an array element for every record (new line) 

//Loop through the result 
foreach ($csv as $key => $item) 
{ 
    array_push($csvtmp, str_getcsv($item,";")); //push each record to the csv temp array 

    //here's the messy part. This set the key of the csvFinal array to the first field in the current record and for the value it gives it the array we got from the previous str_getcsv. 
    $csvFinal[$csvtmp[$key][0]] = $csvtmp[$key]; 
    //Here we just unset the id row in the final array 
    unset($csvFinal[$csvtmp[$key][0]][0]); 

} 

echo "<pre>"; 
    print_r($csvFinal); 
echo "</pre>"; 

結果:

Array 
(
    [22] => Array 
     (
      [1] => name1 
      [2] => address1 
      [3] => town1 
      [4] => state1 
      [5] => zip1 
      [6] => phone1 
      [7] => website1 
      [8] => other1 
      [9] => other1 
     ) 

    [23] => Array 
     (
      [1] => name2 
      [2] => address2 
      [3] => town2 
      [4] => state2 
      [5] => zip2 
      [6] => phone2 
      [7] => website2 
      [8] => other1 
      [9] => other1 
     ) 

    [24] => Array 
     (
      [1] => name3 
      [2] => address3 
      [3] => town3 
      [4] => state3 
      [5] => zip3 
      [6] => phone3 
      [7] => website3 
      [8] => other1 
      [9] => other1 
     ) 
} 

希望這有助於

+0

我今天晚些時候會測試這個。謝謝您的幫助! –

+0

不應使用'\ n'來確定csv中的新行,如果任何列行中有多行,則\ n將會中斷。 –

0

嘛,算了算項目的數量,然後一個條目進行循環內的循環

// loop on all items; $i+=$ITEM_SIZE go to the next item each outer loop 
// (10 elements for ITEM in Opening Post's case) 

// this for loops between all items 
for ($i=0;$i<=$ARRAY_LENGHT;$i+=10) 
{ 
    // this for loops between each item's elements 
    for($c=1; $c<=10;$c++) 
    { 
     switch($c) 
     { 
      case 1: 
       $id = $array[$i+$c]; 
       break; 

      case 2: 
       $name = $array[$i+$c]; 
       break; 

      case 3: 
       $address = $array[$i+$c]; 
       break; 

      //etc to 10th element: 

      case 10: 
       $other = $array[$i+$c]; 
       break; 

     } 
    } 

    // When the item is all done use the item 
    // it as you need, example: 

    echo "id: {$id}\nname: {$name}\naddress: {$adress}"; //etc 

    // then unset($id,$name,$address, $etc); 
    // for the next iteration of loop (next item) 
} 

這就是我所做的,工作得很好。