2011-11-11 9 views
5

Tôi đang tải lên tệp csv và sau đó phân tích cú pháp nó bằng str_getcsv. Tất cả các công trình tuyệt vời ngoại trừ việc tôi cần một cách để vượt qua chúng. Lý tưởng nhất, nó muốn được tuyệt vời để có mảng trở lại và trông như thế này:Vấn đề mảng str_getcsv php

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 
     ) 
) 

Tuy nhiên các dữ liệu trở lại như sau:

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 

Bất kỳ đề xuất về cách sửa lỗi này để tìm giống như mảng ở trên cùng? ngay bây giờ tôi đang làm:

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

có thể trùng lặp của [chuỗi CSV PHP thành mảng] (http://stackoverflow.com/questions/17761172/php-csv-string-to-array) – user

+0

Tôi đã đánh dấu mục này là trùng lặp bất chấp thực tế là điều này câu hỏi là trước đó chỉ vì câu hỏi đó là phổ biến hơn nhiều – user

Trả lời

11

str_getcsv() hy vọng chuỗi truyền như tham số để được một kỷ lục.
Nhưng kể từ nguồn của bạn là một tập tin nào là cách dễ nhất có lẽ là sử dụng fgetcsv() thay vì str_getcsv()

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

khép kín dụ:

<?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 
    ); 
} 

in

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: Để sử dụng các yếu tố đầu tiên của mỗi bản ghi là chìa khóa trong mảng kết quả:

<?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

này trả về cùng một điều vẫn còn cho tôi. Tôi cần nó để trông giống như mảng trên đầu trang của câu hỏi –

+0

@ Drew: Sau đó, có thể bạn có một vấn đề với php không phát hiện dòng kết thúc trong tập tin. xem http://docs.php.net/filesystem.configuration#ini.auto-detect-line-endings – VolkerK

+0

Nó vẫn không hoạt động nhưng tHanks để được giúp đỡ của bạn. –

0

Không phải là người đẹp thứ trên thế giới này nhưng tôi nghĩ rằng nó hoạt động.

//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>"; 

kết quả của mã:

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 
     ) 
} 

Hope this helps

+0

Tôi sẽ kiểm tra điều này sau vào ngày hôm nay. cảm ơn đã giúp đỡ! –

+0

Không được sử dụng '\ n' khi xác định hàng mới trong csv,' \ n' sẽ ngắt nếu bất kỳ hàng cột nào có nhiều dòng trong đó. –

0

Vâng, chỉ cần đếm số lượng các mục một mục đã sau đó tạo ra một vòng lặp bên trong một vòng lặp

// 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) 
} 

Đó là những gì tôi vừa làm và hoạt động rất tốt.