Сортировка массива с ключами по значениям
У меня есть двухмерный массив 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);