Я хочу создать универсальную функцию для сортировки многомерного массива. Например: у меня есть этот массив
$arr = [
[
'product' => [
'id' => 32,
],
'price' => 23.8,
],
[
'product' => [
'id' => 2,
],
'price' => 150,
],
];
И мне нужно отсортировать по $arr[0]['product']['id']. Я хочу использовать такую сортировку: usort($arr, sortArray('product.id', 'desc'));
Не могли бы вы представить, как я могу это сделать?






изменить для DESC как:
return $a['product']['id'] - $b['product']['id'];
изменить для ASC как:
return $b['product']['id'] - $a['product']['id'];
попробуйте этот код:
<?php
$arrrrr = [
[
'product' => [
'id' => 32,
],
'price' => 23.8,
],
[
'product' => [
'id' => 2,
],
'price' => 150,
],
];
$args = array('product.id','asc');//define an array of args
usort($arrrrr, function($a, $b) use ($args) {
$firstVal = explode(".",$args[0]);
if ($args[1]=='desc'){
return $a[$firstVal[0]][$firstVal[1]] - $b[$firstVal[0]][$firstVal[1]];
}else{
return $b[$firstVal[0]][$firstVal[1]] - $a[$firstVal[0]][$firstVal[1]];
}
});
echo '<pre>';print_r($arrrrr);echo '</pre>';
?>
ожидаемый результат:
Array
(
[0] => Array
(
[product] => Array
(
[id] => 2
)
[price] => 150
)
[1] => Array
(
[product] => Array
(
[id] => 32
)
[price] => 23.8
)
)
Спасибо за ответ, но это не решает проблему. Мне нужно создать одну универсальную функцию, которая сортирует любой массив по любым подключам.
В соответствии с вашими текущими требованиями, он будет работать нормально.
Это просто пример. Один массив должен сортироваться по $ arr [0] ['product_id'], второй - по $ arr [0] ['user'] ['rating'] ['top'] и т. д. Но для сортировки у меня есть использовать только одну функцию
Важнейшей частью этого является написание функции доступа, которая берет одну строку из ваших данных вместе с «путем» в точечной нотации, например rating.top.
$accessor = function($row, $path) {
$steps = explode('.', $path);
$return = $row[array_shift($steps)];
while ($level = array_shift($steps)) {
$return =& $return[$level];
}
return $return;
};
Это углубляется в массив на каждом шаге пути и преобразуется в значение в конце. Он будет работать для произвольного количества шагов, например user.rating.top.foo.var.whatever. По сути, это очень урезанная версия Компонент Symfony PropertyAccess.
Используя это, вы можете создать обратный вызов для передачи в usort, который будет сравнивать полученные значения из двух сравниваемых элементов.
usort($array, function ($a, $b) use ($field, $accessor) {
$aVal = $accessor($a, $field);
$bVal = $accessor($b, $field);
return $aVal <=> $bVal;
});
Вы можете увидеть полностью работающую версию здесь: https://3v4l.org/UciGc
Возможный дубликат Сортировка многомерного массива PHP usort ()