Web

Как отсортировать многомерный массив по некоторому значению?

Как отсортировать этот массив по значению определенного ключа?

Несмотря на то, что значения в настоящее время являются последовательными, они не всегда будут такими.

Array (

    [0] => Array (

            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4

            [title]   => Flower

            [order]   => 3

        )

    [1] => Array (

            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594

            [title]   => Free

            [order]   => 2

        )

    [2] => Array (

            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b

            [title]   => Ready

            [order]   => 1

        )

)

 

Ответ 1

Попробуйте usort. Если вы все еще используете PHP 5.2 или более раннюю версию, вам сначала нужно определить функцию сортировки:

function sortByOrder($a, $b) {

    return $a['order'] - $b['order'];

}

 

usort($myArray, 'sortByOrder');

 

Начиная с PHP 5.3, можно использовать анонимную функцию:

usort($myArray, function($a, $b) {

    return $a['order'] - $b['order'];

});

 

И, наконец, в PHP 7 вы можете использовать spaceship operator:

usort($myArray, function($a, $b) {

    return $a['order'] <=> $b['order'];

});

 

Чтобы выполнить это для многомерной сортировки, укажите второй/третий элементы сортировки, если первый равен нулю - лучше всего объяснено ниже. Также это можно использовать для сортировки по подэлементам.

usort($myArray, function($a, $b) {

    $retval = $a['order'] <=> $b['order'];

    if ($retval == 0) {

        $retval = $a['suborder'] <=> $b['suborder'];

        if ($retval == 0) {

            $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];

        }

    }

    return $retval;

});

 

Если вам нужно сохранить ассоциации ключей, используйте uasort().

 

Ответ 2

function aasort (&$array, $key) {

    $sorter = array();

    $ret    = array();

    reset($array);

    foreach ($array as $ii => $va) {

        $sorter[$ii] = $va[$key];

    }

    asort($sorter);

    foreach ($sorter as $ii => $va) {

        $ret[$ii] = $array[$ii];

    }

    $array = $ret;

}

aasort($your_array, "order");

 

Ответ 3

Я использую эту функцию:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {

    $sort_col = array();

    foreach ($arr as $key => $row) {

        $sort_col[$key] = $row[$col];

    }

    array_multisort($sort_col, $dir, $arr);

}

array_sort_by_column($array, 'order');



Ответ 4

Один из подходов к достижению этого был бы таким:

$new = [

    [

        'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',

        'title'   => 'Flower',

        'order'   => 3,

    ],

    [

        'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',

        'title'   => 'Free',

        'order'   => 2,

    ],

    [

        'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',

        'title'   => 'Ready',

        'order'   => 1,

    ],

];

$keys = array_column($new, 'order');

array_multisort($keys, SORT_ASC, $new);

var_dump($new);

 

Результат:

Array (

    [0] => Array (

            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b

            [title]   => Ready

            [order]   => 1

        )

    [1] => Array (

            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594

            [title]   => Free

            [order]   => 2

        )

    [2] => Array (

            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4

            [title]   => Flower

            [order]   => 3

        )

)

 

Ответ 5

Чтобы отсортировать массив по значению ключа "title", используйте:

uasort($myArray, function($a, $b) {

    return strcmp($a['title'], $b['title']);

});

 

strcmp сравнивает строки.

uasort () сохраняет ключи массива в том виде, в котором они были определены.

 

Ответ 6

Наиболее гибким подходом было бы использование этого метода:

Arr::sortByKeys(array $array, $keys, bool $assoc = true): array

 

И вот почему:

  • Вы можете сортировать по любому ключу (также вложенному как 'key1.key2.key3' или ['k1', 'k2', 'k3']);

  • Работает как с ассоциативными, так и с неассоциативными массивами ($assoc флаг);

  • Не используются ссылки возвращается новый отсортированный массив.

 

В вашем случае это было бы так просто:

$sortedArray = Arr::sortByKeys($array, 'order');

 

Этот метод является частью библиотеки MinWork Array.

Схожие статьи

Лучшие бесплатные платформы для создания сайтов без особых навыков
Web

Лучшие бесплатные платформы для создания сайтов без особых навыков

Web

Самый простой способ профилировать PHP-скрипт

Сертификат SSL Let’s encrypt. Что это такое и где используется?
Web

Сертификат SSL Let’s encrypt. Что это такое и где используется?

Web

Применение выражения eval в php