2015-09-17 7 views
1

Как использовать первую строку CSV, которую я обрабатываю с помощью fgetcsv(), в качестве ключа к массиву, в который я помещаю каждую строку? Поэтому вместо того, чтобы иметь ключи элемента $line[0], $line[6] и т. Д., Я могу просто использовать $line['order-id'] и $line['purchase-date'].Использование первой строки CSV в качестве ключей массива

Это происходит только потому, что иногда используемый мной источник данных переключает строки вокруг, поэтому им нужно ссылаться на имя столбца, чтобы убедиться, что я выбираю правильные данные. Вот код, который я сейчас использую:

// create a new array that will be a child to $array for each order, contains details. 
while (($line = fgetcsv($file,'',' ','\n')) !== FALSE) { 
    // count (for email later on) 
    if(!isset($count)) { 
     $count = count($line); 
    } 

    // add to new array (subarray) 
    $individualarray = array(
     'order-id' => $line[0], 
     'buyer-name' => ucwords($line[11]), 
     'purchase-date' => $line[6], 
     'email-address' => $line[10] 
    ); 
    $num++; 
    // add to the array of all orders 
    $array[$num] = $individualarray; 
} 
//remove first record from array, these are the headers. 
unset($array[1]); 

// close file 
fclose($file); 

Вот образец CSV я использую:

amazon-order-id merchant-order-id purchase-date last-updated-date order-status fulfillment-channel sales-channel order-channel url ship-service-level product-name sku asin item-status quantity currency item-price item-tax shipping-price shipping-tax gift-wrap-price gift-wrap-tax item-promotion-discount ship-promotion-discount ship-city ship-state ship-postal-code ship-country promotion-ids 
xxxxx-xxxxx-xxxxx xxxxx-xxxxx-xxxxx 2015-09-17T09:27:35+00:00 2015-09-17T09:27:37+00:00 Pending Amazon Amazon.es   Standard Some product name xx-xxxx-xxxx xxxxxxx Unshipped 1 EUR 19.99        Huelva Huelva xxxxx ES  
xxxxx-xxxxx-xxxxx xxxxx-xxxxx-xxxxx 2015-09-17T17:35:28+00:00 2015-09-17T17:35:29+00:00 Pending Amazon Amazon.co.uk   Expedited Another Product Name xx-xxxx-xxxx xxxxxxx Unshipped 1 GBP 14.99        Eastleigh Hampshire xxxx xxx GB 

ответ

1

Ваш fgetcsv() не выглядит правильно. Вам нужно либо "\t" за вкладку, либо за 3 пробела. Я понятия не имею, что вы делаете с попыткой новой строки \n.

Получить первую линию и комбинировать:

// get first line 
$keys = fgetcsv($file, 0, "\t"); 

while (($line = fgetcsv($file, 0, "\t")) !== FALSE) { 
    $array[] = array_combine($keys, $line); 
} 

Или только для определенных столбцов:

$array[] = array(
        $keys[0] => $line[0], 
        $keys[11] => ucwords($line[11]), 
        $keys[6] => $line[6], 
        $keys[10] => $line[10] 
); 
+0

Также см http://stackoverflow.com/questions/4260086/php-how-to- use-array-filter-to-filter-array-keys, чтобы не требовать жесткого кодирования номеров столбцов. – bernie

+0

Пробовал следующий код, он возвратил много значений bool (false). http://pastie.org/private/2c6v6ky4hhctsrn8pmeg – James

+0

Я не знаю, как выглядит ваш файл. Это либо плохо отформатировано, либо неверны параметры 'fgetcsv()'. – AbraCadaver