Порядок по тексту, а затем по номеру - PullRequest
1 голос
/ 06 июня 2010

У меня есть такие данные, как:

Аудио 1 Тест
Файл 10
Аудио 2
Аудио 3
Файл 11 Аудио 1
Аудио 13
Аудио 22 * ​​1010 * Файл 20 Тест
Тестовый файл 22 * ​​1012 * Аудио 10
Файл 1
Файл 2

Мне нужно сначала упорядочить текст (т. Е. Аудио,Файл, Тест), а затем по номеру (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21, 22 и т. Д.)

Проблема в том, что при сортировке возвращается что-то вроде этого:

Аудио 1
Аудио 1 Тест
Аудио 10
Аудио 13
Аудио 2
Аудио 22 * ​​1028 * Аудио 3
Файл 1
Файл 10
Файл 11
Файл 2
Файл 20 Тест
Файл теста 22 * ​​1035 *

В то время как результат, который я хочу получить:

Аудио 1
Аудио 1 Тест
Аудио 2
Аудио 3
Аудио 10
Аудио 13
Аудио 22 * ​​1047 * Файл 1
Файл 2
Файл 10
Файл 11
Файл 20 Тест
Тестовый файл 22 * ​​1053 *

Если бы они были просто числами(т.е. без аудио,файл, тест) тогда я мог бы просто численно отсортировать.

Однако, как я могу отсортировать здесь сначала по тексту, а затем по номеру.

Ответы [ 2 ]

4 голосов
/ 06 июня 2010

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

Вот решение, которое я сделал для вас за 2 минуты (поэтому извиняюсь за некрасивый код).

<?php

$str = 'Audio 1
File 10
Audio 2
Audio 3
File 11
Audio 13
Audio 22
File 20
Test 22
Audio 10
File 1
File 2';

$arr = explode("\n", $str);

foreach($arr as $k => $v) {
    $arr[$k] = explode(" ", $v);
}

function mycmp($value1, $value2) {
    $txt1 = $value1[0];
    $txt2 = $value2[0];
    $num1 = intval($value1[1]);
    $num2 = intval($value2[1]);

    if($txt1 === $txt2) {
        return $num1 > $num2;
    }
    else {
        return strcmp($txt1, $txt2) > 0;
    }
};


usort($arr, "mycmp");

foreach($arr as $v) {
    echo $v[0]. "\t" . $v[1]. "\n";
}
2 голосов
/ 06 июня 2010

Я думаю, что вы ищете natsort .

bool natsort (array & $ array)

Эта функция реализует алгоритм сортировки, который упорядочивает буквенно-цифровые строки так, как это делает человек, сохраняя связи ключ / значение. Это описывается как «естественный порядок» ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...