Как объединить такие элементы массива?
Задан массив такого формата:
$data = [
[
"NAME" => "asdasd",
"FILE_ID" => 12,
"COLOR" => "red",
"PHONE" => "89998887744",
"EMAIL" => "[email protected]"
],
[
"NAME" => "asdasd",
"FILE_ID" => 12,
"COLOR" => "blue",
"PHONE" => "89998887744",
"EMAIL" => "[email protected]"
],
[
"NAME" => "asdasd",
"FILE_ID" => 12,
"COLOR" => "yellow",
"PHONE" => "89998887744",
"EMAIL" => "[email protected]"
],
];
Результатом должен быть один элемент массива который сгруппировал в массив значения элементов, которые отличны друг от друга.
Т.е. результат должен быть такой:
[
"NAME" => "asdasd",
"FILE_ID" => 12,
"COLOR" => [
"red",
"blue",
"yellow"
],
"PHONE" => "89998887744",
"EMAIL" => [
"[email protected]",
"[email protected]"
]
]
Какие есть элегантные варианты решения ? кроме решения в лоб: пробежаться в уикле, сравнивать элементы текущего и следующего элемента, если отличны, до добавить в массив.
Ответы (1 шт):
Автор решения: Node_pro
→ Ссылка
В чистом(native) php, я не могу припомнить функцию, которая решала бы Вашу задачу. В этом случае, на мое мнение лучше использовать цикл(Производительность будет выше). Но можно попробовать использовать комбинацию: array_map + array_column + array_unique + array_keys.
<?php
$data = [
[
"NAME" => "asdasd",
"FILE_ID" => 12,
"COLOR" => "red",
"PHONE" => "89998887744",
"EMAIL" => "[email protected]"
],
[
"NAME" => "asdasd",
"FILE_ID" => 12,
"COLOR" => "blue",
"PHONE" => "89998887744",
"EMAIL" => "[email protected]"
],
[
"NAME" => "asdasd",
"FILE_ID" => 12,
"COLOR" => "yellow",
"PHONE" => "89998887744",
"EMAIL" => "[email protected]"
],
];
function group_array($data){
return array_map(function($key) use ($data) {
$result = array_unique(array_column($data, $key));
if(sizeof($result) === 1) return $result[0];
return $result;
}, array_keys($data[0]));
}
var_dump(group_array($data));
Пример работы можно увидит тут