сортировка массивов с помощью самостоятельно созданного алфавита - PullRequest
0 голосов
/ 16 июня 2011

в Python У меня есть следующее, что работает отлично:

list = [('wr', ['A1']), ('wr-qA', ['A3']), ('wr,w', ['A4']), ('wr-mw', ['A2']), ('wrs', ['A6']), ('wrD', ['A8']), ('wrS', ['A7']), ('wr.w', ['A5']), ('=k', ['A10']), ('Dd', ['A9'])]

alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@"

Sorted_list = sorted(list, key=lambda (v, k): [alphabet.index(c) for c in v])
print Sorted_list


Output = [('wr', ['A1']), ('wr-mw', ['A2']), ('wr-qA', ['A3']), ('wr,w', ['A4']), ('wr.w', ['A5']), ('wrs', ['A6']), ('wrS', ['A7']), ('wrD', ['A8']), ('Dd', ['A9']), ('=k', ['A10'])]

Как я могу сделать то же самое в PHP с:

$list = array('wr' => 'A1', 'wr-qA' => 'A3', 'wr,w' => 'A4', 'wr-mw' => 'A2', 'wrs' => 'A6', 'wrD' => 'A8', 'wrS' => 'A7', 'wr.w' => 'A5', '=k' => 'A10', 'Dd' => 'A9');

Ответы [ 3 ]

4 голосов
/ 16 июня 2011

Я не совсем понимаю ваш вопрос, но если вам нужно выполнить пользовательскую сортировку в PHP, вам нужно использовать usort или uasort.Вероятно, второй, как я вижу, у вас есть собственный ключ в вашем массиве.

Если вам повезло и вы можете использовать PHP 5.3, вы можете предоставить обратный вызов как как закрытие .

Это будет эквивалент в PHP сортировки пользователей.Эквивалент indexOf в PHP будет strpos.

Предупреждение. Будьте внимательны при сравнении возвращаемых значений strpos, поскольку он может вернуть false, если не найдет совпадений.А в PHP false равно (==) 0.


О вашей структуре списка в PHP.Может быть, вам нужно что-то вроде этого.

$list = array(array('wr', array('A1')), array('wr-qA',array('A3')), ...);

Не уверен, хотя.

1 голос
/ 16 июня 2011

Для лямбда-сортировки вы можете использовать usort(...)strcmp() для сравнения)

usort($list, "strcmp"); // PHP function name as a string

Начиная с PHP 5.3 вы также можете использовать анонимную функцию в качестве обратного вызовапараметр

usort($list, function($a, $b) { return strcmp($a, $b) }); 
// Note - callback function must return integer comparison between 2 elements

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

0 голосов
/ 16 июня 2011

Это то, что я придумал.Он использует uksort(), который принимает определяемую пользователем функцию сортировки и сортирует элементы по их ключам (что и нужно, как кажется).

Код может нуждаться внемного подправил, но я попробовал и все работает.После вызова uksort() переменная $list будет содержать отсортированный массив.

В этом примере кода я использовал Анонимную функцию в качестве функции сортировки, которая доступна из PHP 5.3до этого вы можете использовать простую функцию (например, вы можете проверить ссылку uksort(), которую я связал ранее).

$list = array('wr' => 'A1', 'wr-qA' => 'A3', 'wr,w' => 'A4', 'wr-mw' => 'A2', 'wrs' => 'A6', 'wrD' => 'A8', 'wrS' => 'A7', 'wr.w' => 'A5', '=k' => 'A10', 'Dd' => 'A9');
$alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@";

uksort($list, function ($a, $b) use ($alphabet) {
    $shorter=min($a, $b);
    $len=strlen($shorter);
    for ($i=0, $len=strlen($shorter); $i < $len; $i++) {
        $aval=strpos($alphabet, $a[$i]);
        $bval=strpos($alphabet, $b[$i]);
        if ($aval!=$bval) {
            return $aval > $bval ? 1 : -1;
        }
    }
    return $shorter==$b ? 1 : -1;
});

РЕДАКТИРОВАТЬ: Я быстро написал версию безанонимная функция:

$list = array('wr' => 'A1', 'wr-qA' => 'A3', 'wr,w' => 'A4', 'wr-mw' => 'A2', 'wrs' => 'A6', 'wrD' => 'A8', 'wrS' => 'A7', 'wr.w' => 'A5', '=k' => 'A10', 'Dd' => 'A9');

function alphabet_sorter($a, $b) {
    $alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@";

    $shorter=min($a, $b);
    $len=strlen($shorter);
    for ($i=0, $len=strlen($shorter); $i < $len; $i++) {
        $aval=strpos($alphabet, $a[$i]);
        $bval=strpos($alphabet, $b[$i]);
        if ($aval!=$bval) {
            return $aval > $bval ? 1 : -1;
        }
    }
    return $shorter==$b ? 1 : -1;
}

uksort($list, 'alphabet_sorter');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...