Вернуться




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



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

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

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.



Если вам понравилась эта статья поделитесь ею с друзьями, тем самым вы помогаете нам развиваться и добавлять всё больше интересного и полезного контента!




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





Какой хостинг выбрать для сайта

Какой хостинг выбрать для сайта

Для беспроблемного функционирования сайта на просторах интернета необходимо ...

15 Февраля 2021    Web

Как и на чём лучше писать сайты?

Как и на чём лучше писать сайты?

Каждый начинающий сайтостроитель мечтает создать свой уникальный сайт на ко ...

21 Февраля 2021    Web

Ищем качественный и недорогой хостинг? Тогда вам сюда

Ищем качественный и недорогой хостинг? Тогда вам сюда

Рано или поздно всем вебмастерам приходится искать хостинг для своего проек ...

21 Февраля 2021    Web