@DoneBass
начинающий веб разработчик)

Как отсортировать массив по нескольким параметрам?

собственно есть ассоциативный массив ключами которого есть разные слова , а в качестве значений количество их вхождения в текст.
Нужно сортировать этот массив так: если у первого слова больше вхождений, чем у второго, то первое в списке будет выше. Если у них поровну вхождений, то выше будет то, которое идет первым по алфавиту. Если слова начинаются одинаково , то первым идет то, которое короче.
Как вообще это можно реализовать?
Тапками не кидайтесь, я новичек в php, голову ломаю второй день
  • Вопрос задан
  • 454 просмотра
Пригласить эксперта
Ответы на вопрос 3
alsopub
@alsopub
uksort вам поможет - fi2.php.net/manual/ru/function.uksort.php

$data = array(
  'asd' => 5,
  'sdf' => 7,
  'a' => 7,
);


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

uksort($data, $cmp);

var_dump($data);
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
пузырьком, но вам я думаю придется паковать массив в массив, т.е. первый элемент типа $arr[1]["key"]["44"];
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Давайте разбираться.

У нас есть две сортировки. Сначала мы должны отсортировать по ключам, что бы добиться нужного порядка записи для случаев, когда у нас идет одинаковое количество вхождений строк для разных слов, а затем уже сортировать по количеству вхождений. Тут важно заметить что порядок сортировки обратный, от большего к меньшему. Учитывая это напишем такой вот простенький код:

$arr = [
    'a1' => 2,
    'a2' => 1,
    'a4' => 5,
    'a3' => 5,
    'a5' => 7
];

ksort($arr);
arsort($arr);

var_dump($arr == [
    'a5' => 7,
    'a3' => 5,
    'a4' => 5,
    'a1' => 2,
    'a2' => 1,
]); // true


На вскидку не смог придумать ситуаций когда arsort сделает лишние перестановки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы