Вы можете использовать usort
, используя функцию сортировки, которая извлекает название города из значения plan_name
, используя explode
.Если названия городов совпадают, мы извлекаем номер уровня, чтобы вместо этого можно было сортировать по нему:
usort($array, function ($a, $b) {
$city_a = explode('-', $a['plan_name'])[1];
$city_b = explode('-', $b['plan_name'])[1];
if ($city_a == $city_b) {
// sort by tier
$tier_a = (int)explode(' ', $a['plan_name'])[1];
$tier_b = (int)explode(' ', $b['plan_name'])[1];
return $tier_a - $tier_b;
}
else {
return strcmp($city_a, $city_b);
}
});
Я не включил вывод, так как он довольно длинный, но вы можете увидеть его в этом демо на 3v4l.org
Это альтернативная версия, которая использует preg_match
для извлечения города и уровня из каждого plan_name
:
usort($array, function ($a, $b) {
preg_match('/^Tier\s*(\d+)\s*-\s*(\w+)$/', $a['plan_name'], $matches_a);
preg_match('/^Tier\s*(\d+)\s*-\s*(\w+)$/', $b['plan_name'], $matches_b);
// are the cities the same?
if ($matches_a[2] == $matches_b[2]) {
// yes, sort by tier
return $matches_a[1] - $matches_b[1];
}
else {
// no, sort by city
return strcmp($matches_a[2], $matches_b[2]);
}
});
Демонстрация на 3v4l.org