Сортировка массива php c Городами

231
23 июня 2018, 01:40

на выхлопе есть массив с городами , отсортированный в алфавитном порядке. Необходимо Москву и Питер поставить первыми, а далее также в алфавитном порядке Побывал сдвинуть ключи массива, и поменять Москве и Питеру на 01 и 02. Но чего-то не выходит. Подскажите пожалуйста правильный алгоритм, как решить эту задачу Заранее спасибо

array(4) {
[0]=> array(8) {
    ["CITY"]=>
    string(18) "Волгоград"
}
[1]=> array(8) {
    ["CITY"]=>
    string(18) "Ростов-на-Дону"
}
[2]=> array(8) {
    ["CITY"]=>
    string(18) "Казань"
}
[3]=> array(8) {
    ["CITY"]=>
    string(18) "Москва"
}
[4]=> array(8) {
    ["CITY"]=>
    string(18) "Санкт-Петербург"
}
[5]=> array(8) {
    ["CITY"]=>
    string(18) "уфа"
}}

Или как правильно при переборке масива foreach менять ключи у Москвы и Питера, и ставить их выше других

Answer 1

Коряво получилось, но работает ))

for($i = 0; $i < count($array); $i++){
    foreach ($array[$i] as $key=>$value){
       if ($key == 'CITY' && $value == 'Москва' || $value == 'Санкт-Петербург'){
         $array2[] = $array[$i];
         unset($array[$i]);
       }
     }
   }
  foreach ($array2 as $city){
    array_unshift($array, $city);
  }
    var_dump($array);
Answer 2

Можно использовать пользовательскую сортировку usort. Вот пример:

$ar_sort = [
    100 =>'Москва',
    50 => 'Санкт-Петербург'
];
usort($array, function($a, $b) use($ar_sort) {
    $a_key = array_search($a['CITY'], $ar_sort);
    $b_key = array_search($b['CITY'], $ar_sort);
    if($a_key > $b_key) {
        return -1;
    } else if($a_key < $b_key) {
        return 1;
    } else if($a['CITY'] > $b['CITY']) {
        return 1;
    } else if($a['CITY'] < $b['CITY']) {
        return -1;
    }
    return 0;
});

То есть идея простая: Имеем массив сортировки $ar_sort. Сначала ищем вхождение в него и сравниваем результат, а уже после сравниваем как обычные строки.

Answer 3

Можно удалить Москву и Питер, а затем добавить их в начало массива.

function capitals($item){
    return in_array($item['CITY'], ['Москва', 'Санкт-Петербург']);
}
function not_capitals($item){
    return !capitals($item);
}
$arr = [ваш массив с городами];
$capitals = array_filter($arr, "capitals"); // Столицы
$notCapit = array_filter($arr, "not_capitals"); // Остальные города
// результирующий массив, где москва и питер в начале
$result = array_merge($capitals, $notCapit);
READ ALSO
Как заменить русскую букву по позиции?

Как заменить русскую букву по позиции?

Пытаюсь рандомно заменять русские буквы на английские:

172
PHP: хранить данные в Cookie или в базе данных?

PHP: хранить данные в Cookie или в базе данных?

Подскажите, пожалуйста, как организовать хранение настроек пользователей: в cookie или в базе данных? Например, пользователь на сайте выбрал,...

172
OpenCart, не меняется статус модуля

OpenCart, не меняется статус модуля

Устанавливаю вот такой вот модуль https://opencartforumcom/files/file/1011-dostavka-po-oblastyam-na-karte/ , но по какой-то причине не меняется его статус и он не хочет работать

264
Работа с массивом $_SESSION

Работа с массивом $_SESSION

Можно ли использовать инструкцию echo внутри массива $_SESSION? Нужно, чтобы каждый элемент массива имел уникальное имя

202