@KuznetsovIS

Сортировка многомерного массива PHP. Вложенные массивы. Как отсортировать вложенные массивы по двум параметрам?

Добрый день!

Помогите разобраться с сортировкой.

Я имею массив вида:

Array
	(
    [SOME_RANDOM_INTEGER_VALUE_1] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_1
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 2
                    [1] => 90
                )
		)
    [SOME_RANDOM_INTEGER_VALUE_2] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_2
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 2
                    [1] => 45
                )
		)
    [SOME_RANDOM_INTEGER_VALUE_3] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_3
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 3
                    [1] => 2
                )
		)
    [SOME_RANDOM_INTEGER_VALUE_4] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_3
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 3
                    [1] => 1
                )
		)
    [SOME_RANDOM_INTEGER_VALUE_5] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_3
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 1
                    [1] => 0
                )
		)
)


И мне необходимо преобразовать его в следующий:

Array
	(
    [SOME_RANDOM_INTEGER_VALUE_3] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_3
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 3
                    [1] => 2
                )
		)
    [SOME_RANDOM_INTEGER_VALUE_4] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_3
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 3
                    [1] => 1
                )
		)
    [SOME_RANDOM_INTEGER_VALUE_1] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_1
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 2
                    [1] => 90
                )
		)
    [SOME_RANDOM_INTEGER_VALUE_2] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_2
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 2
                    [1] => 45
                )
		)
    [SOME_RANDOM_INTEGER_VALUE_5] => Array
        (
            [ID] => SOME_RANDOM_INTEGER_VALUE_3
            [SORTING_INFO_ALL_STARS] => Array
                (
                    [0] => 1
                    [1] => 0
                )
		)
)


SOME_RANDOM_INTEGER_VALUE_* - это ID позиции, может принимать практически любые значения.

Пробую отсортировать массивы по двум параметрам:

1) [SOME_RANDOM_INTEGER_VALUE_*][SORTING_INFO_ALL_STARS][0] - значение первой сортировки (от большего к меньшему);
2) [SOME_RANDOM_INTEGER_VALUE_*][SORTING_INFO_ALL_STARS][1] - от большего к меньшему, но, расставить их в общем массиве необходимо уже, в зависимости от [SORTING_INFO_ALL_STARS][0]

То есть, например, так:
[3][3] , [3][2] , [2][3] , [2][0] , [1][4] , [1][3] , [1][2] и т.п.

Пробовал разобраться с помощью usort и array-multisort, к сожалению, безуспешно. Не могу понять, как получение значение [SORTING_INFO_ALL_STARS], обойдя [SOME_RANDOM_INTEGER_VALUE_*], но при это переместить [SOME_RANDOM_INTEGER_VALUE_*] выше или ниже...

Как по мне такая сортировка достаточна специфична и не хотелось бы создавать отдельный массив с ID элемента и значением свойства и сортировать этот массив...
  • Вопрос задан
  • 2743 просмотра
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Я правильно понимаю, что вам нужно что-то вроде этого?:

usort($array, function ($a, $b) {
    return strcmp(
        implode($a['SORTING_INFO_ALL_STARS']), 
        implode($b['SORTING_INFO_ALL_STARS'])
    );
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы