我想在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]
的数组应该在最后。
答案 0 :(得分:7)
您可以使用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 :(得分:1)
您可以将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字符串,这样会更好)
我实际上刚遇到this答案,它可以更好地解释它,并处理值是否不在order数组内。
答案 2 :(得分:0)
根据您的$alphabet = "AjawbpfmnrhHxXsSqkgtTdD";
,并根据您的评论假设A
&lt; j
&lt; a
等,将替代字母表中的每个键转换为系列在已知的字母表中,例如使用如下映射:
your alphabet: AjawbpfmnrhHxXsSqkgtTdD
'real'alphabet: abcdefghijklmnopqrstuvw
所以键'Ajaw' => 'abcd'
和'fmnr' => 'ghij'
等等。然后将你的键变成你可以使用传统的php函数排序的东西。你需要一些方法来处理原始字母表中没有的字符。
这样的东西可能会起作用 - 你需要两个变换函数(从你的字母表到'真实'字母表,反之亦然),然后是比较器,例如: uksort
。
我的两分钱 - 谢谢你澄清原来的问题。
答案 3 :(得分:0)
幸运的是,您的自定义字母表没有比单字节拉丁字母列表更多的字符,因此翻译是一个非常简单易读的过程。
我建议您在开始排序之前设置一个翻译数组,然后为了排序的目的对键进行翻译/规范化。
代码:(Demo)
$array = [
'=k_0' => ['test1'],
'aA_2' => ['test2'],
'sqA_1' => ['test3'],
'=kj_0' => ['test4'],
'awA_2' => ['test5'],
'= D_1' => ['test6'],
'sq A_1' => ['test7'],
'sqA_2' => ['test8'],
];
$trans = ['AjawbpfmnrhHxXsSqkgtTdD =', 'abcdefghijklmnopqrstuvwxy'];
uksort(
$array,
function ($a, $b) use ($trans) {
return strtr($a, ...$trans) <=> strtr($b, ...$trans);
}
);
var_export($array);
输出:
array (
'aA_2' =>
array (
0 => 'test2',
),
'awA_2' =>
array (
0 => 'test5',
),
'sqA_1' =>
array (
0 => 'test3',
),
'sqA_2' =>
array (
0 => 'test8',
),
'sq A_1' =>
array (
0 => 'test7',
),
'=k_0' =>
array (
0 => 'test1',
),
'=kj_0' =>
array (
0 => 'test4',
),
'= D_1' =>
array (
0 => 'test6',
),
)
从 PHP7.4 开始,可以使用箭头函数语法减少语法。
uksort(
$array,
fn($a, $b) => strtr($a, ...$trans) <=> strtr($b, ...$trans)
);
答案 4 :(得分:-1)
<?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;
}
?>
答案 5 :(得分:-3)
请参阅此代码:
<?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
)