Как я могу отсортировать массивы в php по алфавиту? - PullRequest
5 голосов
/ 15 июня 2011

Я хочу отсортировать массивы по ключу в php. но я использую алфавит не обычный английский алфавит, а самостоятельно созданный алфавит. Возможно ли это?

Мой алфавит

$alphabet = "AjawbpfmnrhHxXsSqkgtTdD =";

Массив выглядит так:

Array (
   [=k_0] => Array(
       [0] => DI.3,2 &dwA-nTr& @Hrw@
       [1] => mA
       [2] => =k
       [3] => Sfj,t
       [4] => =k
       [5] => pXr
       )
   [aA_2] => Array(
       [0] => DI.7,4 &dwA-nTr& @Hrw-smA-tA,wj@
       [1] => snD
       [2] => aA
       [3] => Sfj,t
       [4] => jt
       [5] => jt,w
       )
  [sqA_1] => Array(
       [0] => DI.6,18 &dwA-nTr& @nswt@
       [1] => ra
       [2] => sqA
       [3] => Sfj,t
       [4] => =s
       [5] => r
       )
   );

поэтому, если я отсортирую этот массив по алфавиту, массив с ключом [=k_0] должен быть в конце.

Ответы [ 5 ]

7 голосов
/ 15 июня 2011

Вы можете использовать функцию usort() и предоставить собственную логику сортировки.

См. php.net для примера.

Редактировать : использовать uksort, а не usort. Смотрите http://www.php.net/manual/en/function.uksort.php. Спасибо @Darien!

Немного измененный пример с php.net - оригинальный код с добавленным отображением $alphabet:

function cmp($a, $b)
{
    // custom sort order - just swapps 2 and 3.
    $alphabet = array (1 => 1, 2 => 3, 3 => 2, 4 => 4, 5 => 5, 6=> 6);

    if ($alphabet[$a] == $alphabet[$b]) {
        return 0;
    }
    return ($alphabet[$a] < $alphabet[$b]) ? -1 : 1;
}

$a = array(3 => 'c' , 2 => 'b', 5 => 'e', 6 => 'f', 1=>'a');
uksort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
1 голос
/ 03 июля 2018

Вы можете использовать usort () с массивом пользовательских заказов, например,

$order = array("A","j","a","w","b","p","f","m","n","r","h","H","x","X","s","S","q","k","g","t","T","d","D"," ","=");
    usort($arr, function ($a, $b) use ($order) {
        $posA = array_search($a, $order);
        $posB = array_search($b, $order);
        return $posA - $posB;
    });

(возможно, вы можете просто взорвать строку $ order, чтобы она была лучше)

На самом деле я только что натолкнулся на этот ответ, который объясняет его лучше и обрабатывает, если значение не находится внутри массива заказа.

0 голосов
/ 26 сентября 2017
<?php
$arr = [8,10,12,18,20,7,4,6,2,20,0]; //take array

 $a= sortasc($arr); // call function

function sortasc($arr){


    for($i=0;$i<=count($arr);$i++){
            for($j=1;$j<=count($arr)-1;$j++){

                         if($arr[$j-1]>$arr[$j]){

                        $temp = $arr[$j];
                        $arr[$j]= $arr[$j-1];
                        $arr[$j-1] = $temp;
                    }
        }
    }
        return $arr;
}

?>
0 голосов
/ 15 июня 2011

Учитывая ваш $alphabet = "AjawbpfmnrhHxXsSqkgtTdD"; и предполагая, что A <<code>j <<code>a и т. Д., В соответствии с вашим комментарием, преобразуйте каждую клавишу в альтернативном алфавите в серию в известном алфавите, например, используйте отображение, подобное:

  your alphabet: AjawbpfmnrhHxXsSqkgtTdD
 'real'alphabet: abcdefghijklmnopqrstuvw

Таким образом, ключ 'Ajaw' => 'abcd', 'fmnr' => 'ghij' и т. Д. Затем он превращает ваши ключи в то, что вы можете отсортировать, используя обычные функции php.Вам понадобится какой-то способ обработки символов-символов, отсутствующих в вашем исходном алфавите.

Что-то подобное может сработать - вам понадобятся две функции преобразования (из вашего алфавита в «настоящий» алфавит и наоборот),а затем компаратор, например, uksort.

Мои два цента - спасибо за разъяснение исходного вопроса.

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

См. Этот код:

<?php

$arr = array('wr' => 1, 'wrS' => 6, 'wr,w' => 3, 'wr.w' => 4, 'wr-qA' => 2, 'wrs' => 5);

function compare_by_alphabet(array $alphabet, $str1, $str2)
{
    $l1 = strlen($str1);
    $l2 = strlen($str2);
    $c = min($l1, $l2);

    for ($i = 0; $i < $c; $i++)
    {
        $s1 = $str1[$i];
        $s2 = $str2[$i];
        if ($s1===$s2) continue;
        $i1 = array_search($s1, $alphabet);
        if ($i1===false) continue;
        $i2 = array_search($s2, $alphabet);
        if ($i2===false) continue;
        if ($i2===$i1) continue;
        if ($i1 < $i2) return -1;
        else return 1;
    }
    if ($l1 < $l2) return -1;
    elseif ($l1 > $l2) return 1;
    return 0;
}

function compare_keys_by_alphabet($a, $b)
{
    static $alphabet = array('-', ',', '.', 'A', 'j', 'a', 'w', 'b', 'p', 'f', 'm', 'n', 'r', 'h', 'H', 'x', 'X', 's', 'S', 'q', '‌​k', 'g', 't', 'T', 'd', 'D', '=', '/', '(', ')', '[', ']', '<', '>', '{', '}', '\'', '*', '#', 'I', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, '&', '@');
    return compare_by_alphabet($alphabet, $a, $b);
}

uksort($arr, 'compare_keys_by_alphabet');

print_r($arr);

Результат:

Array
(
    [wr] => 1
    [wr-qA] => 2
    [wr,w] => 3
    [wr.w] => 4
    [wrs] => 5
    [wrS] => 6
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...