<?php
$people =
[
[
[
'id'=>3,
'name'=>'George'
],
[
'id'=>5,
'name'=>'Ringo'
]
],
[
[
'id'=>3,
'name'=>'George'
],
[
'id'=>7,
'name'=>'Paul'
]
],
[
[
'id'=> 9,
'name'=> 'John'
]
]
];
$peeps = array_merge(...$people);
$peeps = array_column($peeps, null, 'id');
var_export($peeps);
Выход:
array (
3 =>
array (
'id' => 3,
'name' => 'George',
),
5 =>
array (
'id' => 5,
'name' => 'Ringo',
),
7 =>
array (
'id' => 7,
'name' => 'Paul',
),
9 =>
array (
'id' => 9,
'name' => 'John',
),
)
array_column, отфильтровывает дубликаты, используя идентификатор в качестве ключей для окончательного массива.
Спасибо Alive to Die за то, что отметили, что это нарушит ваш оригинальный формат. Поскольку распаковка массива завершается неудачно с использованием строковых ключей, это можно сначала исправить с помощью вызова array_values, поэтому в вашем случае:
$output = array_merge(...array_values($array));
$output = array_column($output, null, 'ID');