2013-05-29 3 views
1

Я пытаюсь сортировать данные в алфавитном порядке от НАЗВАНИЯ КОМПАНИИ из плоского файла. Я думал, что простой способ справится с этим, но я ошибся. Теперь я думаю, что мне нужно использовать usort и cmp, а затем создать другой временный массив. Как я могу это сделать?Сортировка массива плоских файлов

Это мой текущий код.

$data_file = fopen($data_file_url, "r"); 
fgets($data_file); // IGNORE FIRST LINE IN FLATFILE - column names 
while (!feof($data_file)) { 
    $data_lines = fgets($data_file); 
    $data_ele = explode('|', $data_lines); 

    $company_name = $data_ele[0]; 
    $section = $data_ele[1]; 
    $category = $data_ele[2]; 
    $service = $data_ele[3]; 
    $service = substr_replace($service,"",-1); // trim last char 
} 
+0

Пожалуйста, представьте предварительный просмотр '$ data_file_url'. –

+0

Было бы гораздо более эффективно сортировать данные перед записью файла, а не пересортировать его каждый раз, когда он будет прочитан. – Sammitch

ответ

1

Вы должны сначала сохранить все элементы в большом массиве, а потом разбирайтесь с помощью обратного вызова:

$data_file = fopen($data_file_url, "r"); 
fgets($data_file); // IGNORE FIRST LINE IN FLATFILE - column names 

$companies = array(); 
while (!feof($data_file)) { 
    $data_lines = fgets($data_file); 
    $data_ele = explode('|', $data_lines); 

    $row = array(); 
    $row['company_name'] = $data_ele[0]; 
    $row['section'] = $data_ele[1]; 
    $row['category'] = $data_ele[2]; 
    $row['service'] = $data_ele[3]; 
    $row['service'] = substr_replace($row['service'],"",-1); // trim last char 

    $companies[] = $row; 
} 

usort($companies, function ($a, $b) { 
    return strcmp($a['company_name'], $b['company_name']); 
}); 

Пожалуйста, обратите внимание: я использую анонимные функции, введенные в PHP 5.3.0.

+0

В моем исходном коде я бы напечатал значение, подобное этому: echo $ company - - - Как напечатать новое значение? – mar2195

+0

Отбросив значение в массиве ... – Beat

+0

(* В коде substr_replace есть опечатка: «$$».) Но даже после исправления я все равно получаю сообщение об ошибке при запуске этого кода ... где-то в функции usort. Есть идеи? – mar2195

0

Я хотел бы ответить на ответ Beats только с использованием названия компании в качестве ключа в массиве.

Если у вас есть несколько записей на одну компанию, у вас есть вспомогательный массив.

Используя ключ как массив, он уже проиндексирован при вставке.

Я считаю, что это быстрее.

Здесь вы также можете использовать fgetcsv, что также возможно немного быстрее.

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