Сортировка массива по значению

chuikoff

Array( array( 'name' => 'title 1', 'price' => '200' ) array( 'name' => 'title 2', 'price' => '100' ) ...
)

У меня есть такой массив. Как мне его сортировать по значению ключа price, от меньшего к большему?

6 ответов

chuikoff

Сортировка пользовательской функцией: usort().

usort($array, function($a, $b){ return ($a['price'] - $b['price']);
});


chuikoff

$data = array
( array( 'name' => 'title 1', 'price' => 200 ), array( 'name' => 'title 2', 'price' => 100 )
);
usort
( $data, create_function ( '$a,$b', 'rerturn -($a["price"] - $b["price"]);' )
);

1) не забываем, что поля price должны быть int, а не строками (в противном случае нужно явное преобразование)

2) если нужно обратный порядок сортировки:

rerturn $a["price"] - $b["price"];


chuikoff

Можешь преобразовать его в массив вида:

array('200' => 'title1', '100' => 'title2') и отсортировать стандартной функцией php ksort(или другой, какой захочешь)


chuikoff

Нашёл на просторах интернета:

function cmp($a, $b){ return strnatcmp($a["product_order"], $b["product_order"]);
}
usort($parts, "cmp");


chuikoff

функция uasort предназначена для сортировки с помощью пользовательской функции, но с сохранением ключей массива (в отличие от usort).


chuikoff

мучился долго с похожей проблемой, вот мое решение:

принцип:

  • строим еще один массив "2" где ключ нового массива = ключ старого, а само значение = значение по которому хотим сортировать;
  • сортируем новый массив "2" СОХРАНЯЯ КЛЮЧИ (asort, arsort);
  • ну и далее строим еще один массив "3" на основе массива "2" - проходим по массиву "2" и по ходу вставляем в массив "3" "подмассив" массива "1" по ключу массива "2";
  • массив "3" и есть наш отсортированный.
for ($i=0; $i < count($array); $i++) { $sortkey[$i]=$array[$i]['price'];
}
asort($sortkey);//по возрастанию, arsort($sortkey) - по убыванию
foreach ($sortkey as $key => $key) { $sorted[]=$array[$key];
}

licensed under cc by-sa 3.0 with attribution.