#php #sorting
#php #сортировка
Вопрос:
Я читаю из текстового файла, который имеет 2 столбца. имя, ранг, чтобы это выглядело так:
quxerm,6
brock,5
chris,15
Таким образом, 2d-массив выглядит как [0][0] = quxerm и [0][1]=6 [1][0] = брок [1][1]=5
У меня уже есть их в 2d-массив, как я показал выше.
Мне нужно отсортировать эти значения в порядке убывания по целочисленному столбцу. Как я могу это отсортировать?
Комментарии:
1. Что вы хотите отсортировать? Строка или целочисленный столбец?
2. Я хочу отсортировать по целочисленному столбцу.
Ответ №1:
ответ @ CBergau почти идеален, но порядок будет возрастающим, а не убывающим. Чтобы получить его по убыванию, просто переключите возвращаемые значения функции сравнения, которая вызывается usort . Смотрите http://www.php.net/manual/en/function.usort.php для получения дополнительной информации.
function cmp(array $a, array $b) {
return ($a[1] < $b[1]) ? 1 : -1;
}
usort($arr, 'cmp');
Пример: http://codepad.org/QRTQLxTh
Вы также можете расширить функцию сравнения, например, для упорядочения по возрастанию по имени, когда ранг одинаков, используя strcmp. Смотрите http://www.php.net//manual/en/function.strcmp.php для получения дополнительной информации.
function cmp(array $a, array $b) {
if ($a[1] == $b[1]) {
return strcmp($a[0], $b[0]);
}
return ($a[1] < $b[1]) ? 1 : -1;
}
Пример: http://codepad.org/SeRTE3Ym
Примечание: у меня еще недостаточно репутации, чтобы просто прокомментировать ответ @CBergau.
Ответ №2:
Вместо этого используйте map, и тогда вы сможете использовать все функции, связанные с такими картами.
Ответ №3:
примите массив как arr[i][j] .
попробуйте сравнить, только изменив значения i .
for(int i=0;i<3;i )
for(int k=1;k<3;k )
if(arr[i][1]>arr[k][1])
max=i
и вы можете получить максимум с помощью :- arr[max][0]//name of max
arr[max][1]//value of max
Ответ №4:
$sorted = array();
foreach($yourArray as $a){
$sorted[$a[1]] = $a[0];
}
ksort($sorted);
vardump($sorted);
Ответ №5:
Это должно сортироваться по целочисленному столбцу:
usort(
$data,
function ($arrayOne, $arrayTwo) {
return ($arrayOne[1] < $arrayTwo[1]) ? -1 : 1;
}
);
Ответ №6:
Если нет повторяющихся имен, вы можете просто присвоить ключу (имени) ранг и отсортировать этот массив, сохранив ключи.
$data["quxerm"] = 6;
$data["brock"] = 5;
$data["chris"] = 15;
asort($data, SORT_NUMERIC);