2011-11-11 23 views
5

Estoy cargando un archivo csv y luego analizándolo usando str_getcsv. Todo funciona bien, excepto que necesito una forma de recorrerlos. Idealmente, sería bueno tener la matriz volver y tener este aspecto:php str_getcsv serie de matriz

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

Sin embargo los datos provienen de vuelta como la siguiente:

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 

¿Alguna sugerencia sobre cómo solucionar este problema que debe buscar como la matriz en la parte superior? En este momento estoy haciendo:

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

posible duplicado de [PHP CSV cadena a matriz] (http://stackoverflow.com/questions/17761172/php-csv-string-to-array) – user

+0

He marcado esto como un duplicado a pesar del hecho de que esto la pregunta es anterior solo porque esa pregunta es mucho más popular – user

Respuesta

11

str_getcsv() espera que la cadena pasada como parámetro a ser uno registro.
Pero ya que su fuente es un archivo de todos modos la forma más fácil es probablemente usar fgetcsv() en lugar de str_getcsv()

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

autónomo ejemplo:

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

impresiones

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: Para poder utilizar el primer elemento de cada registro como la clave de la matriz resultado:

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

esto me devuelve la misma cosa. Necesito que se vea como la matriz en la parte superior de la pregunta –

+0

@Drew: Entonces tal vez tengas un problema con php al no detectar los finales de línea dentro del archivo. ver http://docs.php.net/filesystem.configuration#ini.auto-detect-line-endings – VolkerK

+0

Todavía no está funcionando, pero pide ayuda. –

0

No lo pretties en este mundo, pero creo que funciona.

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

resultado del código:

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

espero que esto ayude

+0

Voy a probar esto más tarde hoy. ¡gracias por la ayuda! –

+0

No debe usar '\ n' como determinar una nueva fila en el csv,' \ n' se romperá si alguna fila de columnas tiene múltiples líneas. –

0

Bueno, simplemente contar el número de elementos de una entrada y luego ha hacer un bucle dentro de un bucle

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

Eso es lo que acabo de hacer y funciona muy bien.