Лучший способ сортировки 2d массива Php

#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);