Я хочу сортировать массивы с помощью ключа в 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]
должен быть в конце.
Вы можете использовать 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"; }
Учитывая ваш $alphabet = "AjawbpfmnrhHxXsSqkgtTdD";
, и предполагая, что A
< j
< a
и т. д. в вашем комментарии преобразуйте каждую клавишу в альтернативном алфавите в серию в известном алфавите, например, используйте сопоставление, например:
your alphabet: AjawbpfmnrhHxXsSqkgtTdD 'real'alphabet: abcdefghijklmnopqrstuvw
Таким образом, ключ 'Ajaw' => 'abcd'
и 'fmnr' => 'ghij'
и т. Д. Это превращает ваши ключи в то, что вы можете сортировать, используя обычные функции php. Вам нужно каким-то образом обработать символы, не присутствующие в вашем исходном алфавите.
Что-то вроде этого может работать – вам понадобятся две функции преобразования (от вашего алфавита до «реального» алфавита и наоборот), а затем компаратор, например, uksort
.
Мои два цента – спасибо за разъяснение первоначального вопроса.
<?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; } ?>
-<?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; } ?>
Смотрите этот код:
<?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 )