那么, 有许多帖子和问题使用usort对自定义模式排序数组,但没有找到符合我需要的任何内容。 这是我到目前为止的代码,
$arrayToSort=array("Sabin","Anil","Cyrus","Kamal","Kesha","Bimal");
function mycmp($a, $b)
{
static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S');
return array_search(substr($a,0,1), $order) - array_search(substr($b,0,1), $order);
}
usort($arrayToSort, "mycmp");
以上代码按以下格式对$ arrayToSort进行排序
Array
(
[0] => Anil
[1] => Bimal
[2] => Cyrus
[3] => Kamal
[4] => Kesha
[5] => Sabin
)
然而,如果你看一下我的自定义模式static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S');
Kesha应该在Kamal之前,就像我的模式一样,Ke' Ke'来自Ka'
我再次知道substr($a,0,1)
只取第一个字符,这就是为什么它不起作用。
我也怀疑我必须采取另一种方法来完成工作,但我无法弄明白。
如果数组模式的元素不一致,如何排序,即一些元素有一个字符,而其他元素有两个?任何帮助将非常感谢。感谢
答案 0 :(得分:1)
这是一种可以做到的方法。这肯定可以更好地优化,但你明白了。
<?php
class Accessor {
static $order = array(
'A' => 1,
'B' => 1,
'C' => 1,
'K' => array(
'e' => 1,
'a' => 1,
),
'R' => 1,
'S' => 1
);
}
$arrayToSort=array("Kamal","Kesha","Sabin","Anil","Cyrus","Bimal");
function mycmp($a, $b, $base) {
$letter1 = $a[0];
$letter2 = $b[0];
if ($letter1 == $letter2) {
if (is_array($base[$letter1])) {
return mycmp(substr($a, 1), substr($b, 1), $base[$letter1]);
}
}
return array_search($letter1, array_keys($base)) - array_search($letter2, array_keys($base));
}
function cmp_proxy($a, $b) {
return mycmp($a, $b, Accessor::$order);
}
usort($arrayToSort, "cmp_proxy");
print_r($arrayToSort);
<强>输出强>
Array
(
[0] => Anil
[1] => Bimal
[2] => Cyrus
[3] => Kesha
[4] => Kamal
[5] => Sabin
)
答案 1 :(得分:0)
试试这个
$arrayToSort=array("Sabin","Anil","Cyrus","Kamal","Kesha","Bimal");
function mycmp($a, $b)
{
static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S');
return searchArray($a, $order) - searchArray($b, $order);
}
function searchArray($str,$order) {
$i = 1;
do {
$result = array_search(substr($str,0,$i++),$order);
if($result)
return $result
}while(i < strlen($str))
return -1;
}
usort($arrayToSort, "mycmp");