#php #arrays #sorting #multidimensional-array
#php #массивы #сортировка #многомерный массив
Вопрос:
Как отсортировать этот массив по pos
атрибуту , даже если ключи ( name, store_id, product etc.
)
[Attributes] => Array
(
[name] => Array
(
[pos] => 30
)
[store_id] => Array
(
[pos] => 10
)
[product] => Array
(
[pos] => 20
)
)
Редактировать: производительность, конечно, важна.
Ответ №1:
Вы могли бы использовать uasort()
который позволяет вам определять вашу логику сортировки, а также поддерживает ваши ассоциативные индексы. Пожалуйста, обратите внимание, что это изменяет ваш исходный массив и возвращает логическое значение только в случае успеха.
uasort($your_array, function($a, $b) {
return $a['pos'] > $b['pos'];
});
Мой пример работает > = PHP 5.3 , но для более старых версий вы также можете использовать обычную функцию сравнения.
Подробности см. в uasort()
документации.
Комментарии:
1. можете ли вы проверить свой код с помощью этого примера (он почти совпадает с приведенной выше структурой):
$attr['Attr']['name']['pos'] = 30; $attr['Attr']['price']['pos'] = 10; $attr['Attr']['desc']['pos'] = 20;
2. @dino Вы могли бы предоставить точные спецификации, которые вам нужны в вашем вопросе :). Что вы хотите отсортировать здесь? Вы могли бы попробовать вставить
$attr['Attr']
вместо$your_array
.3. @baz.. — Боже милостивый. иногда мой мозг не работает 🙂 Это работает хорошо. большое спасибо
Ответ №2:
Взгляните на функцию PHP array_multisort
.
http://php.net/manual/en/function .array-multisort.php
В комментариях есть пример-функция, которая должна вам подойти:
function array_orderby()
{
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = amp;$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
// $dataArray is the array that contains your data
$sorted = array_orderby($dataArray, 'pos', SORT_DESC);
Комментарии:
1. @Jung — На самом деле я этого не делал … Учтите, что есть еще пара ключей и подобных им структур, которые мне нужно упорядочить. Итак, как я могу управлять этим с помощью array_multisort? Должен ли я изменить структуру? или идея получше?
2. На самом деле это не так просто, как я думал вначале. Но, взглянув на связанную страницу, вы найдете пример в комментариях, который я только что добавил к своему ответу. Это должно отсортировать $dataArray по ‘pos’ по убыванию
3. @Jung — что-то не так с вашим примером. На самом деле я не сортировал его, хотя я предоставил точные спецификации, используя вашу функцию.
4. Похоже, это немного перебор для этого.