Сортировка массива с ключами по значениям

У меня есть двухмерный массив PHP. В первой сортировки нужно упорядочить их по цветам чтобы они не повторялись, во второй если цвет одинаковый то в ключе SIZE хранился массив с размером (XS, S и тд.) отсортированный по VALUE_SORT.

Пример Вход:

[0] => Array
    (
        [ID] => 187
        [SRC] => /upload/iblock/3a4/3a490eef2bb884ccc1fb04319124a3bf.png
        [COLOR] => Черный
        [VALUE_SORT] => 120
        [SIZE] => M
    )

[1] => Array
    (
        [ID] => 186
        [SRC] => /upload/iblock/aca/aca47fd62a9490de3a8ec1e38e2ad74e.png
        [COLOR] => Синий
        [VALUE_SORT] => 120
        [SIZE] => M
    )

[2] => Array
    (
        [ID] => 184
        [SRC] => /upload/iblock/974/974f30b6d872847dde2b111683025156.png
        [COLOR] => Черный
        [VALUE_SORT] => 110
        [SIZE] => S
    )

[3] => Array
    (
        [ID] => 183
        [SRC] => /upload/iblock/691/6917fd3b821454b8be97adaff14ca83e.png
        [COLOR] => Синий
        [VALUE_SORT] => 110
        [SIZE] => S
    )

[4] => Array
    (
        [ID] => 182
        [SRC] => /upload/iblock/358/3582ca1e3d5c97819049bcd0de3c4260.png
        [COLOR] => Красный
        [VALUE_SORT] => 110
        [SIZE] => S
    )

[5] => Array
    (
        [ID] => 180
        [SRC] => /upload/iblock/5ad/5addc658f90fbc58f4cf6d2292555e28.png
        [COLOR] => Синий
        [VALUE_SORT] => 100
        [SIZE] => XS
    )

[6] => Array
    (
        [ID] => 179
        [SRC] => /upload/iblock/85f/85fbaa1dbd931647c5d3cc70fbdd559f.png
        [COLOR] => Красный
        [VALUE_SORT] => 100
        [SIZE] => XS
    )

Выход:

[0] => Array
    (
        [SRC] => /upload/iblock/3a4/3a490eef2bb884ccc1fb04319124a3bf.png
        [COLOR] => Черный
        [SIZE] => Array
            (
                [0] => S
                [1] => M
            )

    )

[1] => Array
    (
        [SRC] => /upload/iblock/aca/aca47fd62a9490de3a8ec1e38e2ad74e.png
        [COLOR] => Синий
        [SIZE] => Array
            (
                [0] => XS
                [1] => S
                [2] => M
            )

    )

[2] => Array
    (
        [SRC] => /upload/iblock/3a4/3a490eef2bb884ccc1fb04319124a3bf.png
        [COLOR] => Красный
        [SIZE] => Array
            (
                [0] => XS
                [1] => S
            )

    )

Буду благодарен если сможете помочь с решением задачи.


Ответы (2 шт):

Автор решения: Максим Степанов

Как вариант, можно переложить исходный массив в новый, ключами которого будет COLOR. А в этом массиве уже сортировать подмассив SIZE по ключу, примерно так:

$sorted_arr = array();

// переложить в массив, где ключ - цвет
foreach ($unsorted_arr as $data){
    $sorted_arr[$data['COLOR']]['SRC'] = $data['SRC'];
    $sorted_arr[$data['COLOR']]['SIZE'][$data['VALUE_SORT']] = $data['SIZE'];
}

// сортировать по SIZE
foreach ($sorted_arr as &$color_data){
    ksort($color_data['SIZE']);
}
→ Ссылка
Автор решения: Denis640Kb

Вот полное корректное решение:

<?php

$Arr = array(Array(
    "ID" => 187,
    "SRC" => "/upload/iblock/3a4/3a490eef2bb884ccc1fb04319124a3bf.png",
    "COLOR" => "Черный",
    "VALUE_SORT" => "120",
    "SIZE" => "M"
),
    Array(
        "ID" => 186,
        "SRC" => "/upload/iblock/aca/aca47fd62a9490de3a8ec1e38e2ad74e.png",
        "COLOR" => "Синий",
        "VALUE_SORT" => 120,
        "SIZE" => "M"
    ),
    Array(
        "ID" => 184,
        "SRC" => "/upload/iblock/974/974f30b6d872847dde2b111683025156.png",
        "COLOR" => "Черный",
        "VALUE_SORT" => 110,
        "SIZE" => "S"
    ),
    Array(
        "ID" => 183,
        "SRC" => "/upload/iblock/691/6917fd3b821454b8be97adaff14ca83e.png",
        "COLOR" => "Синий",
        "VALUE_SORT" => 110,
        "SIZE" => "S"
    ),
    Array(
        "ID" => 182,
        "SRC" => "/upload/iblock/358/3582ca1e3d5c97819049bcd0de3c4260.png",
        "COLOR" => "Красный",
        "VALUE_SORT" => 110,
        "SIZE" => "S"
    ),
    Array(
        "ID" => 180,
        "SRC" => "/upload/iblock/5ad/5addc658f90fbc58f4cf6d2292555e28.png",
        "COLOR" => "Синий",
        "VALUE_SORT" => 100,
        "SIZE" => "XS"
    ),
    Array(
        "ID" => 179,
        "SRC" => "/upload/iblock/85f/85fbaa1dbd931647c5d3cc70fbdd559f.png",
        "COLOR" => "Красный",
        "VALUE_SORT" => 100,
        "SIZE" => "XS"
    )
);

$newArr = [];
foreach ($Arr as $item){
    if($newArr){
        $trig = 0;
        foreach ($newArr as $key=>$item1){
            if($item['COLOR'] == $item1['COLOR']){
                if(!in_array($item['SIZE'], $item1['SIZE'])){
                    array_push($newArr[$key]['SIZE'], $item['SIZE']);
                }
                $trig += 1;
            }
        }
        if ($trig == 0){
            $temp = array(
                "SRC" => $item['SRC'],
                "COLOR" => $item['COLOR'],
                "SIZE" => array($item['SIZE']));
            array_push($newArr, $temp);
        }
    } else {
        $temp = array(
            "SRC" => $item['SRC'],
            "COLOR" => $item['COLOR'],
            "SIZE" => array($item['SIZE']));
        array_push($newArr, $temp);
    }
}

print_r($newArr);
→ Ссылка