функция usort в php - PullRequest
       2

функция usort в php

0 голосов
/ 15 октября 2018

Почему функция usort в следующем фрагменте сортирует матрицу не только по значениям клавиш 'num' в порядке убывания, но также сортирует элементы с равными значениями клавиш 'num' по значениямклавиши lett в порядке возрастания? Как сделать так, чтобы сортировка осуществлялась только по тому, что указано в теле функции?

<?php
$mtx = [["num"=>1,"lett"=>"f"], 
        ["num"=>3,"lett"=>"b"], 
        ["num"=>3,"lett"=>"a"]
];

usort($mtx, function($a,$b) { 
                 if($a['num']<$b['num']) return 1;
                 if($a['num']>$b['num']) return -1;
      });

var_dump($mtx);
/*
  array(3) { [0]=> array(2) { ["num"]=> int(3) ["lett"]=> string(1) "a" } 
             [1]=> array(2) { ["num"]=> int(3) ["lett"]=> string(1) "b" } 
             [2]=> array(2) { ["num"]=> int(1) ["lett"]=> string(1) "f" } 
  } 
*/

1 Ответ

0 голосов
/ 15 октября 2018

Сортировка массива будет пытаться отсортировать каждый элемент против любого другого, поэтому вы не можете заставить usort (который только дает вам значения) поддерживать первоначальный порядок элементов, даже если эти элементы равны.

Однако вы можете использовать uksort, который также предоставит вам доступ к ключам (из исходного массива), что позволит вам вернуться к следующему:

uksort($mtx, function ($key1, $key2) use ($mtx) {
  $a = $mtx[$key1];
  $b = $mtx[$key2];

  if ($a['num'] < $b['num']) {
    return 1;
  }
  if ($a['num'] > $b['num']) {
    return -1;
  }

  return $key1 - $key2;
});

Сокращенная форма:

uksort($mtx, function ($key1, $key2) use ($mtx) {
  return $mtx[$key2]['num'] - $mtx[$key1]['num'] ?: $key1 - $key2;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...