PHP сортировка массива с помощью uasort

#php #sorting

#php #сортировка

Вопрос:

Итак, я отсортировал многомерный массив с помощью uasort в порядке убывания. Я сделал var_dump($winrateArray) , и он отсортирован должным образом. Наибольшее значение находится в первом возвращенном массиве. Однако, когда я пробую var_dump($winrateArray[0][3]) , где я ожидаю получить наибольшее значение, его там нет. Вместо этого он находится в $winrateArray[1][3] . Правильно ли я использую uasort ?

Несортированный дамп:

 array(2) { [0]=> array(4) { [0]=> string(2) "18" [1]=> string(1) "1" [2]=> int(0) [3]=> int(1) } [1]=> array(4) { [0]=> string(2) "31" [1]=> string(1) "1" [2]=> int(100) [3]=> int(101) } }
  

Сортированный дамп:

 array(2) { [1]=> array(4) { [0]=> string(2) "31" [1]=> string(1) "1" [2]=> int(100) [3]=> int(101) }  [0]=> array(4) { [0]=> string(2) "18" [1]=> string(1) "1" [2]=> int(0) [3]=> int(1) } }
  

Конкретный дамп:

 int(1)
  

.

 $winrateArray[0][0] = '18';
$winrateArray[0][1] = '1';
$winrateArray[0][2] = 0;
$winrateArray[0][3] = 1;

$winrateArray[1][0] = '31';
$winrateArray[1][1] = '1'
$winrateArray[1][2] = 100;
$winrateArray[1][3] = 101;

var_dump($winrateArray);

function cmp($a, $b){
        if ($a[3] == $b[3]){
            return 0;
        }
        return ($a[3] < $b[3]) ? 1 : -1;
    }

uasort($winrateArray, 'cmp');

var_dump($winrateArray);
var_dump($winrateArray[0][3]); 
  

Комментарии:

1. опубликуйте примерный набор данных, которые вы используете, нам будет очень полезно помочь и протестировать.

2. Нам нужно увидеть массив и результаты.

3. Как я вижу, результат упорядочен правильно, но ключи сохранены, а вы этого не хотите?

4. Я добавил некоторые данные и показал результаты дампов. Честно говоря, я думаю, что просто неправильно истолковываю, как работает этот вид. Я думал, что это переместит наибольшее значение в [0] [3], 2-е по величине в [1][3].

5. Нет, это так не работает

Ответ №1:

Вы можете сделать:

 $newArray = $winrateArray;
uasort($winrateArray, 'cmp');

$i = 0;
foreach($winrateArray as $key => $item) {
     $newArray[$i][3] = $item[3];
     $i  ;
}
  

и после этого использует новый массив. Вы сохраните ключи и измените порядок и замените только 3 элемента

Комментарии:

1. Это решение работает отлично. Я не совсем понимаю, что делает «as $key => $item», но большое спасибо!

2. $key — это ключ текущего элемента в цикле foreach (родительские ключи), а элемент содержит внутренний массив (массив с 3 элементами) данного родительского элемента.