vasmor
@vasmor
Интересуюсь

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

Всем привет!
Задача:
Есть исходный многомерный массив(прикладываю его часть):

$array = array (
  'accessories' => 
  array (    
    array (
      'id' => 11,
      'accessory_group_id' => 6,
      'title' => 'Добор 2050*110*16',
      'vendor_code' => '025-0079',
    ),    
    array (
      'id' => 769,
      'accessory_group_id' => 6,
      'title' => 'Карниз Тип-3 120 см',
      'vendor_code' => '025-0123',
    ),    
    array (
      'id' => 768,
      'accessory_group_id' => 12,
      'title' => 'Добор 2050*110*16',
      'vendor_code' => '025-0079',
    ),    
    array (
      'id' => 3464,
      'accessory_group_id' => 6,
      'title' => 'Карниз Тип-3 70 см',
      'vendor_code' => '025-0120',
    ),    
    array (
      'id' => 3465,
      'accessory_group_id' => 6,
      'title' => 'Добор 2050*110*16',
      'vendor_code' => '025-0079',
    ),    
    array (
      'id' => 3466,
      'accessory_group_id' => 6,
      'title' => 'Карниз Тип-3 90 см',
      'vendor_code' => '025-0122',
    ),
  ),
);


В элементах массива 'accessories' есть ключ 'vendor_code' и его значение в некоторых элементах повторяется(в данном примере это элементы с индексами 0, 2 и 4) - условно назовем эти элементы "одинаковые". В этих "одинаковых" элементах значение ключа 'accessory_group_id' может повторяться(элементы с индексами 0 и 4).
Суть вопроса заключается в следующем:
как оставить в исходном массиве только элементы с уникальным значением ключа 'vendor_code', при этом в ключ 'accessory_group_id' добавить уникальные значения со всех "одинаковых" элементов через запятую?
Пример необходимого результата:

$result_array = array (
  'accessories' => 
  array (    
    array (
      'id' => 11,
      'accessory_group_id' => '6,12'
      'title' => 'Добор 2050*110*16',
      'vendor_code' => '025-0079',
    ),    
    array (
      'id' => 769,
      'accessory_group_id' => 6,
      'title' => 'Карниз Тип-3 120 см',
      'vendor_code' => '025-0123',
    ), 
    array (
      'id' => 3464,
      'accessory_group_id' => 6,
      'title' => 'Карниз Тип-3 70 см',
      'vendor_code' => '025-0120',
    ), 
    array (
      'id' => 3466,
      'accessory_group_id' => 6,
      'title' => 'Карниз Тип-3 90 см',
      'vendor_code' => '025-0122',
    ),
  ),
);


Подскажите, пожалуйста, как это сделать? Подойдёт любая помощь: алгоритм, псевдокод или готовый код...)
Заранее всем спасибо!
  • Вопрос задан
  • 449 просмотров
Решения вопроса 1
Skiphog
@Skiphog
Crutch developer
Моё варварское решение в лоб ))

$array = [
    'accessories' => [ /* ... Ваш массив ... */],
];


$tmp = [];

foreach ($array['accessories'] as $item) {
    if (!isset($tmp[$item['vendor_code']])) {
        $tmp[$item['vendor_code']] = $item;
        continue;
    }

    $tmp[$item['vendor_code']]['accessory_group_id'] = implode(',',
        array_unique(
            explode(',', $tmp[$item['vendor_code']]['accessory_group_id'] . ',' . $item['accessory_group_id'])
        )
    );
}

$result_array['accessories'] = array_values($tmp);

var_dump($result_array);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
$result_array = [
    'accessories' => array_values(array_combine(
        array_column($array['accessories'], 'vendor_code'),
        $array['accessories']
    ))
];


Так устроит?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы