正如其他人所說,usort
和一個定製的比較適合。這裏有一個例子,它有一個工廠函數(在這種情況下是一個返回函數的函數),它根據所需的前綴生成比較器(使用closures)。
$subject = explode(',', 'london,bluehit,green,lonpark,abc,aab,lonsee');
function make_comparator($prefix)
{
return function ($a, $b) use ($prefix) {
if (strpos($a, $prefix) === 0 && strpos($b, $prefix) !== 0) {
// $a starts with $prefix (and $b does not), sift up
return -1;
} elseif (strpos($a, $prefix) !== 0 && strpos($b, $prefix) === 0) {
// $b starts with $prefix (and $a does not), sift down
return 1;
} else {
// Otherwise, do a normal string comparison
return strcmp($a, $b);
}
};
}
$sorted = $subject;
usort($sorted, make_comparator('lon'));
var_dump($sorted);
對於PHP版本低於5.3.0(以上需要),你可以做同樣的事情:
function prefix_comparator($a, $b, $prefix) {
if (strpos($a, $prefix) === 0 && strpos($b, $prefix) !== 0) {
// $a starts with $prefix (and $b does not), sift up
return -1;
} elseif (strpos($a, $prefix) !== 0 && strpos($b, $prefix) === 0) {
// $b starts with $prefix (and $a does not), sift down
return 1;
} else {
// Otherwise, do a normal string comparison
return strcmp($a, $b);
}
}
$sort_by_lon = create_function('$a, $b', 'return prefix_comparator($a, $b, "lon");');
$sorted = $subject;
usort($sorted, $sort_by_lon);
var_dump($sorted);
(道歉行話)
它是一個關聯數組?或多維? – 2010-09-24 12:36:57
爲什麼lonsee在排序列表的末尾,以及在開始? – 2010-09-24 12:38:23