Сортировка многомерного массива

Samail
На сайте с 10.05.2007
Offline
369
792


$cart = json_decode( $jsonString, true );
foreach($cart as $k => $v)
echo $v['price'];

Как отсортировать массив по "$v['price']"?

Вроде понятно что нужно что-то в asort () вставить, но непонятно что именно.

K
На сайте с 28.12.2008
Offline
61
kud
#1
Samail:

$cart = json_decode( $jsonString, true );
foreach($cart as $k => $v)
echo $v['price'];

Как отсортировать массив по "$v['price']"?
Вроде понятно что нужно что-то в asort () вставить, но непонятно что именно.

Если массив $cart многомерный вида $cart = array('price' => 100, 'some_key' => 'some_value'), то можно с помощью array_multisort:

$cart[] = array('price' => 10, 'other_data' => 'some_data');

$cart[] = array('price' => 1, 'other_data' => 'some_data');

$cart[] = array('price' => 4, 'other_data' => 'some_data');

$cart[] = array('price' => 7, 'other_data' => 'some_data');

$cart[] = array('price' => 5, 'other_data' => 'some_data');

$cart[] = array('price' => 6, 'other_data' => 'some_data');

foreach($cart as $k => $v) {

$price_sortable[$k] = $v['price'];

}

array_multisort($price_sortable, SORT_ASC, $cart);

print_r($cart);

Samail
На сайте с 10.05.2007
Offline
369
#2

Массив такой:


{
"1": {
"price": 25,
"strengthRate": 1,
"priceRes": {},
"image": "http://***.com//1.png",
"importance": 27,
"title_en": "Name",
"title_ru": "Название 1",
},
"2": {
"title_en": "*****",
"descr_en": "***********",
"descr_ru": "Описание.",
"title_ru": "Название 2",
"price": 80,
"image": "http://***.com//2.png",
"drop": {
"wood": 2,
"coin": 58
},
"cat": 2,
},
}
[Удален]
#3


<?php
$array1 = json_decode('[ { "price": 25, "title_en": "Name 25" },
{ "price": 32, "title_en": "Name 32" },
{ "price": 25, "title_en": "Name 25" },
{ "price": 17, "title_en": "Name 17" },
{ "price": 25, "title_en": "Name 25" },
{ "price": 85, "title_en": "Name 85" }
]', true);

usort ( $array1 , function($a, $b){ return $a['price'] > $b['price']; });
print_r( $array1 );
?>

если старая версия php < 5.3.0, lambd-у нужно вынести в отдельную функцию:


<?php
function cmp($a, $b)
{
if ($a['price'] == $b['price']) {
return 0;
}
return ($a['price'] < $b['price']) ? -1 : 1;
}

$array1 = json_decode('[ { "price": 25, "title_en": "Name 25" },
{ "price": 32, "title_en": "Name 32" },
{ "price": 25, "title_en": "Name 25" },
{ "price": 17, "title_en": "Name 17" },
{ "price": 25, "title_en": "Name 25" },
{ "price": 85, "title_en": "Name 85" }
]', true);

usort ( $array1 , "cmp");
print_r( $array1 );
?>
Samail
На сайте с 10.05.2007
Offline
369
#4
imagine:
usort ( $array1 , function($a, $b){ return $a['price'] > $b['price']; });

Оно вроде работает, но:

foreach($cart as $k => $v)

Меняется номер $k.

<img alt="<?=$v['title_ru'];?>" itemprop="image" src="/img/<?=$k;?>.png" width="150" height="auto" />

Картинка выводится не та. Как вывести номер который до сортировки был?

---------- Добавлено 01.08.2016 в 21:32 ----------

На uasort поменял. Перестал $k меняться :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий