2015-09-01 2 views
2

У меня есть файл CSV выглядит следующим образом:PHP получить категорию и идентификатор из CSV

CategoryA;ID0001;title1 
CategoryA;ID0002;title2 
CategoryB;ID0001;title3 
CategoryB;ID0002;title4 
CategoryC;ID0001;title5 

[More categories, IDs and titles...] 

Чтобы отсортировать эти записи по категориям и идентификаторы в пределах категории я бы нужно, по крайней мере 2 PHP массивов в друг друга. Первый с категориями и ключом, похожим на «cat», а второй с идентификаторами, имеющими ключ типа «id».

Моя ужасная попытка на этом:

function read_csv($filename){ 
    $rows = array(); 

    foreach (file($filename, FILE_IGNORE_NEW_LINES) as $line){ 
     $rows[] = str_getcsv($line, ';'); 
    }; 

    return $rows; 
}; 

print_r(read_csv("file.csv")); 

Похоже:

Array 
(
    [0] => Array 
     (
      [0] => A 
      [1] => 0001 
      [2] => titel1 
     ) 

    [1] => Array 
     (
      [0] => A 
      [1] => 0002 
      [2] => titel2 
     ) 

    [2] => Array 
     (
      [0] => B 
      [1] => 0001 
      [2] => titel3 
     ) 

[3] => Array 
    (
     [0] => B 
     [1] => 0002 
     [2] => titel4 
    ) 

[4] => Array 
    (
     [0] => C 
     [1] => 0001 
     [2] => titel5 
    ) 

) 

Или есть способ переименовать ключи? Все, что я пробовал, пошло не так. Как мне продолжить?

+0

можно загрузить в db, даже временную таблицу –

+0

В GitHub есть несколько парсеров csv, и я уверен, что php имеет собственный встроенный класс для синтаксического анализа csv. Попробуй это? В противном случае '$ rows []' следует изменить, чтобы включить заголовок столбца (Ie '$ rows [$ column]'), но вы извлекли имя столбца – ScottMcGready

+0

@Dagon, если это просто быстрый скрипт для выполнения определенной цели, это не стоит накладных расходов на создание sql db, но в долгосрочной перспективе, возможно, – ScottMcGready

ответ

0

Вам действительно нужна база данных, даже простая на SQLite. Но для удовольствия, вы можете построить массив CSV с именами столбцов:

$cols = array('cat', 'id', 'title'); 

foreach (file($filename, FILE_IGNORE_NEW_LINES) as $line){ 
    $rows[] = array_combine($cols, str_getcsv($line, ';')); 
} 

Затем вы можете использовать array_column() и сортировать с array_multisort():

array_multisort(array_column($rows, 'cat'), $rows); 

Или, может быть:

array_multisort(array_column($rows, 'cat'), array_column($rows, 'id'), $rows); 

Без названия столбцов вы все равно можете использовать числовой индекс:

array_multisort(array_column($rows, 0), array_column($rows, 1), $rows); 
+0

Это действительно помогает, но все еще не то, что я хотел сделать. Я должен был быть более явным, но вообще-то: я увижу, что я с этим могу сделать. Спасибо. – Even0900

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