2013-11-08 2 views
0

Является ли этот ключ итерации ключом надлежащим образом инициализации пользовательских имен ключей для значений массива str_getcsv? Также является неуместным() дорогостоящим или даже необходимым в этом цикле?пользовательские ключи массива для str_getcsv()

<?php 

$lines = file('csv/random.csv', FILE_IGNORE_NEW_LINES); 

foreach ($lines as $key => $value) 
{ 

     $temp = str_getcsv($value,'|'); 
     $csv[$key]['code'] = $temp[0]; 
     $csv[$key]['name'] = $temp[1]; 
     $csv[$key]['price'] = $temp[2]; 
     $csv[$key]['avail'] = $temp[3]; 
     unset ($temp); 
} 
?> 

EDIT:

Следуя советам в комментариях код выглядит аккуратнее и работает значительно быстрее

$keys = Array('code','name','price','avail'); 
$file = fopen('csv/random.csv',"r"); 
      while(! feof($file)) 
      { 
       $temp[] = array_combine($keys,fgetcsv($file,'1000','|')); 
      } 
      fclose($file); 

Ответ отмечен ниже, я считаю, более профессиональное выполнение этого для тех, кто в этом нуждается.

Спасибо, ребята.

+0

используйте 'array_combine' для ключей на работу применяют ваши строки CSV. – mario

+0

'нестандартный' - хорошая практика. –

+0

@scrowler 'unset' - пустая трата времени, так как он немедленно переназначает переменную. Он мог сделать это в конце цикла, но если они не являются действительно длинными линиями, вряд ли это стоит того. – Barmar

ответ

1

Вы можете использовать SplFileObject класс:

<?php 

$file = new SplFileObject('csv/random.csv'); 
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY 
    | SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD); 
$file->setCsvControl('|'); 
$data = array(); 

foreach ($file as $row) { 
    $data[] = array_combine(array('code', 'name', 'price', 'avail'), $row); 
} 

Вы должны быть уверены, что ваши строки CSV имеют 4 различных полей для использования array_combine() таким образом. Обратите внимание, что это даст вам все поля CSV в виде строк. Если вы хотите, например, чтобы иметь код как целое, имени в виде строки, цены как поплавок и выгодой как целое число для каждой строки, вы можете заменить foreach с этим:

foreach ($file as $row) { 
    $data[] = array_combine(
     array('code', 'name', 'price', 'avail'), 
     array((int) $row[0], $row[1], (float) $row[2], (int) $row[3]) 
    ); 
} 

чтобы применить преобразование INT/поплавок вы можете даже использовать метод fscanf() читать строки:

<?php 

$file = new SplFileObject('csv/random.csv'); 
$file->setFlags(SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE 
    | SplFileObject::READ_AHEAD); 
$data = array(); 

while ($row = $file->fscanf('%d|%[^|]|%f|%d')) { 
    $data[] = array_combine(array('code', 'name', 'price', 'avail'), $row); 
} 
+0

wow это довольно надежное и отказоустойчивое решение, я использовал комбинацию советов от комментариев до того, как мои csv и скрипты используются в контролируемой среде, где я могу позволить себе ослабление кода. тем не менее это ответ! –

Смежные вопросы