splincodewd
@splincodewd
Developer

Как сортировать ключи массива php по алфавиту и длине?

Есть массив:
Array
(
    [олень] => 10
    [лось] => 4
    [бык] => 4
    [кот] => 4
    [быки] => 4
)


Отсортировали по убыванию:
// ассоциативный массив
// $words = [ 'слово' => 'количество повторений' ]


krsort($words);
print_r($words);


Array
(
    [олень] => 10
    [лось] => 4
    [кот] => 4
    [быки] => 4
    [бык] => 4
)


Но нужно так:
Если слова начинаются одинаково ("бык" и "быки"), то первым идет то, которое короче.
Array
(
    [олень] => 10
    [бык] => 4
    [быки] => 4
    [кот] => 4
    [лось] => 4    
)


Какую функцию можно применять для такой сортировки?
  • Вопрос задан
  • 1006 просмотров
Решения вопроса 3
riot26
@riot26
<:З )~~
Возможно, не самый элегантный вариант, но вот:
$file_url = 'test.txt';
$text = file_get_contents($file_url);
$words = preg_split('/\s+/', $text);
$words = array_count_values($words);
arsort($words);
$nums = array_unique(array_values($words));
$res = array();
foreach ($nums as $num) {
    $num_words = array_keys($words, $num);
    asort($num_words);
    foreach($num_words as $num_word) {
        $res[$num_word] = $num;
    }
}
var_dump($res);
Ответ написан
@MadridianFox
Web-программист, многостаночник
Не изобретайте велосипед.
Возьмите какую-нибудь реализацию стемминга на php и сделайте вот такую матрицу:
$words = [
    "слово"=>["кол-во вхождений", "корень", "длинна слова"],
    ...
];

где "корень" - это результат работы стемминг-функции над словом. Такие слова как Бык и Быки будут преобразованы к слову Бык.
Далее эту матрицу сортируем во всем столбцам в том порядке в котором они указаны - по вхождениям, по корню, по длине. Таким образом, одинаково встречающиеся слова отсортированные по корню будут в алфавитном порядке, но когда корни одинаковые - будет играть роль их длинна.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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