Как отсортировать многомерный массив (PHP)?

#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. Похоже, это немного перебор для этого.