2016-09-10 4 views
0

Вот CSV таблице:Как сортировать данные таблицы CSV в PHP по определенному столбцу?

------------------------- 
| Name | Age | Favorite | 
------------------------- 
| John | 30 | Apple | 
------------------------- 
| Bill | 25 | Grape | 
------------------------- 
| Ann | 40 | Orange | 
------------------------- 

Теперь, используя строго PHP, есть в любом случае, чтобы сортировать только «Фаворит» в порядке возрастания от «возраста»? Ожидаемый результат будет что-то вроде этого:

25 Grape 
30 Apple 
40 Orange 

Я использую fgetcsv повторить их на документ, но они не не сортируются по возрастанию возраста, конечно. Есть ли все равно, чтобы бросить их в массив или что-то, сортировать по возрасту, а затем эхо?

+2

@PaulCrovella нет, потому что он конкретно спрашивает о CSV для преобразования массива, а – NoobishPro

ответ

1

Чтобы открыть файл CSV:

function readCSV($file) 
{ 
    $row  = 0; 
    $csvArray = array(); 
    if(($handle = fopen($file, "r")) !== FALSE) { 
    while(($data = fgetcsv($handle, 0, ";")) !== FALSE) { 
     $num = count($data); 
     for($c = 0; $c < $num; $c++) { 
     $csvArray[$row][] = $data[$c]; 
     } 
     $row++; 
    } 
    } 
    if(!empty($csvArray)) { 
    return array_splice($csvArray, 1); //cut off the first row (names of the fields) 
    } else { 
    return false; 
    } 
} 

$csvData = readCSV($csvPath); //This is your array with the data 

Тогда вы могли бы использовать array_multisort() отсортировать его по значению.

<?php 
// Obtain a list of columns 
foreach ($csvData as $key => $row) { 
    $age[$key] = $row['volume']; 
    $favorite[$key] = $row['edition']; 
} 

// Sort the data with age first, then favorite 
// Add $csvData as the last parameter, to sort by the common key 
array_multisort($age, SORT_ASC, $favorite, SORT_ASC, $csvData); 
?> 
+0

вы могли бы также прочитать файл, как это: $ CSV = array_map («str_getcsv», файл («data.csv»)) ; – Michel

+1

@ Мишель, вы не ошибаетесь, но array_map значительно медленнее, чем foreach. Не только немного, но и много. Заменяя такие функции, как те (встроенные функции php-массива очень медленные), мне удалось получить скрипт с 3 минут до 3 секунд. см. http://stackoverflow.com/questions/18144782/performance-of-foreach-array-map-with-lambda-and-array-map-with-static-function для получения дополнительной информации – NoobishPro

+0

Очень интересное чтение, спасибо. Я заметил, что, поскольку PHP7 array_map фактически быстрее почти ничего. – Michel

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