vikkyshostak
@vikkyshostak
< This head full of dreams.

Как сделать сортировку в PHP многомерного JSON-массива по значению определённого ключа (по возрастанию) и дополнительно по алфавиту (по др. ключу)?

Добрый день!

Подскажите, пожалуйста, никак не могу найти (догадаться) решение.. Как сделать сортировку (в PHP 5.6/7) многомерного JSON-массива по значению определённого ключа (по возрастанию) и дополнительно по алфавиту (по др. ключу)?

Поясню. Есть вот такой массив:

[{
	"id": "26",
	"strana": "Таиланд",
	"otel_nazvanie": "Villa Danica",
	"otel_kol_vo_zvezd": "3",
	"otel_stoimost": "22900"
}, {
	"id": "26",
	"strana": "Греция",
	"otel_nazvanie": "Vila Tufi",
	"otel_kol_vo_zvezd": "3",
	"otel_stoimost": "27700"
}, {
	"id": "26",
	"strana": "Кипр",
	"otel_nazvanie": "Villa Kralj",
	"otel_kol_vo_zvezd": "3",
	"otel_stoimost": "28800"
}, {
	"id": "26",
	"strana": "Кипр",
	"otel_nazvanie": "Rooms Rio",
	"otel_kol_vo_zvezd": "3",
	"otel_stoimost": "28750"
}, {
	"id": "26",
	"strana": "Таиланд",
	"otel_nazvanie": "Obala Zelena",
	"otel_kol_vo_zvezd": "3",
	"otel_stoimost": "32050"
}, {
	... // и так далее, до 100 штук.
}]


Как его можно отсортировать (единовременно, ну то есть сразу за один раз), чтобы он:

+ Сортировался по алфавиту из значения ключа strana;
+ Сортировался по возрастанию из значения ключа otel_stoimost;
+ Далее, выводился только первый элемент отсортированного (по параметрам выше) массива;

То есть, в результате должно получиться вот такое:

[{
	"id": "26",
	"strana": "Греция",
	"otel_nazvanie": "Vila Tufi",
	"otel_kol_vo_zvezd": "3",
	"otel_stoimost": "27700"
}, {
	"id": "26",
	"strana": "Кипр",
	"otel_nazvanie": "Rooms Rio",
	"otel_kol_vo_zvezd": "3",
	"otel_stoimost": "28750"
}, {
	"id": "26",
	"strana": "Таиланд",
	"otel_nazvanie": "Villa Danica",
	"otel_kol_vo_zvezd": "3",
	"otel_stoimost": "22900"
}, {
	... // и так далее.
}]


Для чего это нужно: чтобы сделать фильтр по направлениям туризма. Финальный вариант, должен выйти такой (например, из данных выше):

  • Греция от 27 700 руб.
  • Кипр от 28 750 руб.
  • Таиланд от 22 900 руб.


Очень надеюсь на вашу помощь, сам уже реально сижу с квадратной головой.. :(
  • Вопрос задан
  • 585 просмотров
Решения вопроса 1
@imhuman
Зачем сортировать? Просто пройдись один раз по массиву и выбери нужные данные?
$a=json_decode($json, true);
$res=array();
foreach($a as $k=>$v){
    if(!isset($res[$v['strana']])){
        $res[$v['strana']]=$v['otel_stoimost'];
    }else{
        $res[$v['strana']]=min($res[$v['strana']], $v['otel_stoimost']);
    }
}
print_r($res);


Потом если есть необходимость отсортируй массив $res по алфавиту

Если нужна в итоге JSON структура как в твоем примере, то добавляй в итоговый массив не только стоимость, но и другие данные.

$a=json_decode($json, true);
$res=array();
foreach($a as $k=>$v){
    if(!isset($res[$v['strana']])){
        $res[$v['strana']]=$v;
    }else{
        if($v['otel_stoimost']<$res[$v['strana']]['otel_stoimost']){
            $res[$v['strana']]=$v;
        }
    }
}
$min_prices=array();
foreach($res as $v){
    $min_prices[]=$v;
}
echo json_encode($min_prices);


Если нужен просто вывод списка, то достаточно данных полученных первым способом
echo '<ul>';
foreach($res as $k=>$v){
    echo '<li>'.$k.' от '.$v.' руб.</li>';
}
echo '</ul>';
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
BuriK666
@BuriK666
Компьютерный псих
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
++ Сортировать ничего не надо.

Один проход

for(){
    if(strana.otel_stoimost < min_strana.otel_stoimost)
    {
        min_strana.otel_stoimost = strana.otel_stoimost
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы