В PHP есть массив. Он настроен так
$array_var = array(array(1,2,3,4), array(5,6,7,8), array(3,5,3,9));
Этот массив находится из файла csv, полученного с помощью функции fgetcsv. Если бы я должен был правильно отобразить массив, чтобы отобразить его содержимое, я бы сделал так, чтобы он показывал следующее:
field1 field2 field3 field4 1 2 3 4 5 6 7 8 3 5 3 9
и т.д. и т.д ..
Теперь я хочу отсортировать этот массив. Но я хочу сортировать только один из столбцов во всех массивах. Иными словами, и, например, я хочу взять каждое третье значение в каждом массиве внутри основного массива и перечислить их по возрастанию, в алфавитном порядке. Поэтому для конкретного случая мы будем принимать каждое значение в поле 3 из приведенной выше таблицы и сортировать его. А также сделайте так, чтобы конечный результат сортировки изменил порядок столбцов так, чтобы они были правильно выстроены с их значениями.
Конечный результат
field1 field2 field3 field4 1 2 3 4 3 5 3 9 5 6 7 8
и т.д. и т.д ..
Как это можно сделать?
Причина проблемы заключается в том, что я пытаюсь удалить дубликаты из одного столбца в файле csv. Я думаю, что самый быстрый способ сделать это – сортировать значения и искать совпадения в диапазоне.
Трудно дать вам точный ответ, потому что есть вещи, которые вы не учитываете. Например, как следует сортировать строки, сортированные по одному из столбцов, но имеющие различия в других столбцах? Должны ли они сортироваться по какому-либо другому столбцу, оставить их в первоначальном порядке или разместить их в произвольном порядке?
Учитывая то, как я интерпретирую ваш вопрос, я бы, вероятно, определил свой собственный класс для сравнения.
<?php class ColumnCompare { function __construct($column) { $this->column = $column; } function compare($a, $b) { if ($a[$this->column] == $b[$this->column]) { return 0; } return ($a[$this->column] < $b[$this->column]) ? -1 : 1; } } // Hard-coded input $array_var = array(array(1,2,3,4), array(5,6,7,8), array(3,5,3,9)); $sort_by_col = 2; // Create object for sorting by a particular column $obj = new ColumnCompare($sort_by_col); usort($array_var, array($obj, 'compare')); // Write CSV to standard output $sout = fopen('php://stdout', 'w'); foreach ($array_var as $fields) { fputcsv($sout, $fields); } fclose($sout); ?>
В конце вы задаете еще один вопрос, на который невозможно ответить. Если вы удаляете дубликаты из одного столбца, что должно произойти с остальной частью строки? Должна ли поддерживаться только одна строка, и в таком случае какая? Вы также можете «удалить дубликаты» означает, что вы хотите удалить значения и поместить NULL в свои позиции. Если вы хотите, чтобы эта конкретная проблема была решена, вам необходимо предоставить некоторые детали.
Если ваш CSV-файл действительно прост, и все значения в любой строке с дубликатами идентичны (что было в вашем примере до его редактирования), вы можете легко запустить команду, такую как
sort myfile.csv | uniq
но я чувствую, что это сложнее, чем это. uniq
также имеет настройки для возврата только дублированных строк, например. Также можно писать команды для извлечения определенного столбца из каждой строки и работать с ним. Но, как я уже сказал, создать такую команду невозможно без дополнительной информации.