2014-11-07 9 views
2

У меня есть массив JSON нескольких объектов, вот пример:PHP - объединение массивов с таким же значением ключа

$people = [{"name":"John", "color":"green"}, 
      {"name":"Mary", "color":"green"}, 
      {"name":"Bob", "color":"red"}] 

Я использую json_decode($people, true), чтобы преобразовать их в массив ...

Теперь, скажем, Я хочу объединить те, которые имеют то же самое color. Я должен был бы сделать array_merge_recursive($people[0], $people[1]), потому что они оба имеют green как color. Обратите внимание, что я должен указать, какие из них я хочу объединить рекурсивно.

Как я могу пройти через $people после того, как он был декодирован в формат массива и автоматически рекурсивно объединить те, которые имеют одинаковое значение ключа?

Что-то вроде этого:

foreach($people as $person) { 
    // If a person has same color of previous 
    // person then merge them recursively. 
} 

Так что я мог бы получить это после того, как зацикливание:

[{"name":"John, Mary", "color":"green, green"}, 
{"name":"Bob", "color":"red"}] 
+1

Используйте ассоциативный массив, чей ключ является цветом. – Barmar

ответ

1

Сделать результат массив ассоциативный массив ключом по цвету.

$people_by_color = array(); 
foreach ($people as $person) { 
    if (isset($people_by_color[$person['color']])) { 
     $people_by_color[$person['color']]['name'] .= ', ' . $person['name']; 
     $people_by_color[$person['color']]['color'] .= ', ' . $person['color']; 
    } else { 
     $people_by_color[$person['color']] = $person; 
    } 
} 
$people_by_color = array_values($people_by_color); // Turn into indexed array 
+0

Это сработало отлично, спасибо! Кстати, вы пропустили скобку в инструкции 'if'. Я удалил строку 'color' после' name', потому что я действительно не хочу комбинировать два значения, которые являются одинаковыми, я просто решил, что он будет их комбинировать, независимо от того, использует ли он 'array_merge_recursively'. – jstudios