Как уже говорили другие, usort
и сделанный на заказ компаратор подойдут хорошо. Вот пример, который имеет фабричную функцию (в данном случае функцию, которая возвращает функцию), которая генерирует компараторы (используя замыкания ) на основе требуемого префикса.
$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);
(извинения за жаргон)