PHP: хранение строк из CSV в массивах - PullRequest
0 голосов
/ 30 октября 2018

Файл CSV выглядит примерно так:

user_id, fname, lname, country
001, cake, chocolate, US
002, ice cream, vanilla, US
003, pie, pumpkin, US

И я хочу сохранить каждый из них в массив, например:

Array ( [0] => Array ( [0] => user_id [1] => fname [2] => lname [3] => country)
        [1] => Array ( [0] => 001 [1] => cake [2] => chocolate [3] => US)
        [2] => Array ( [0] => 002 [1] => ice cream [2] => vanilla [3] => US)
        [3] => Array ( [0] => 003 [1] => pie [2] => pumpkin [3] => US) 
) 

В настоящее время мой код выглядит так, но сохраняет только последний элемент:

$file = fopen('csvexample.csv', 'r');
$i = 0;
while (($line = fgetcsv($file)) !== FALSE) {
    //$line is an array of the csv elements
    $arr = array($i => $line);
    $i++;
}
fclose($file);
print_r($arr);

Пожалуйста, помогите! Не уверен, что мне не хватает

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Хотя это не то, что вы просили, я считаю, что ассоциативный массив больше подходит. (Если у вас нет причин для указанного формата массива).

Я разрываю строки и использую первую строку в качестве ключей, с которыми позже использую array_combine, чтобы сделать его ассоциативным массивом.

$str ="user_id, fname, lname, country
001, cake, chocolate, US
002, ice cream, vanilla, US
003, pie, pumpkin, US";

$arr = explode("\n", $str); //explode on new line
$keys = explode(", ",array_splice($arr, 0,1)[0]); // get headers to $keys

//loop the array by reference with '&'
foreach($arr as &$sub){
    $sub = array_combine($keys, explode(", ", $sub)); // change the string into an associative array
}
unset($sub); //unset reference
var_dump($arr); //output

Выход:

array(3) {
  [0]=>
  array(4) {
    ["user_id"]=>
    string(3) "001"
    ["fname"]=>
    string(4) "cake"
    ["lname"]=>
    string(9) "chocolate"
    ["country"]=>
    string(2) "US"
  }
  [1]=>
  array(4) {
    ["user_id"]=>
    string(3) "002"
    ["fname"]=>
    string(9) "ice cream"
    ["lname"]=>
    string(7) "vanilla"
    ["country"]=>
    string(2) "US"
  }
  [2]=>
  array(4) {
    ["user_id"]=>
    string(3) "003"
    ["fname"]=>
    string(3) "pie"
    ["lname"]=>
    string(7) "pumpkin"
    ["country"]=>
    string(2) "US"
  }
}

https://3v4l.org/354iT


Возможно, еще лучше, чтобы основным ключом массива был идентификатор пользователя, как в этом примере: https://3v4l.org/hMLil
0 голосов
/ 30 октября 2018

str_getcsv

$arr = array_map('str_getcsv', file('csvexample.csv'));
0 голосов
/ 30 октября 2018

Просто добавьте в ваш массив вот так

$file = fopen('csvexample.csv', 'r');
$arr = [];  // init the array just for completness

while (($line = fgetcsv($file)) !== FALSE) {
    $arr[] = $line;
}
fclose($file);
print_r($arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...