У меня есть многомерный выход массива, как это, как показано ниже, в котором
я хочу объединить ценности pid
а также map
используя любой разделитель, но не comma(,)
где id
такой же
Это пример данных Array имеет более 20000 значений, а уровень глубины неизвестен может быть 18 или 20
Array
(
[pid] => 10000
[map] => 11, 11
[id] => 5740
[parentId] => 5739
[text] => Text1
[children] => Array
(
[0] => Array
(
[pid] => 600
[map] =>
[id] => 5741
[parentId] => 5740
[text] => Adv
[children] => Array
(
[0] => Array
(
[pid] => 620
[map] => 115.43271636963, 28
[id] => 5745
[parentId] => 5741
[text] => Text1.1
)
[1] => Array
(
[pid] => 621
[map] => 1, 2
[id] => 5745
[parentId] => 5741
[text] => Text1.1
)
[2] => Array
(
[pid] => 1748
[map] => 11.43, 28
[id] => 5746
[parentId] => 5741
[text] => Text1.2
)
)
)
[1] => Array
(
[pid] => 700
[map] => 15, 17
[id] => 5750
[parentId] => 5740
[text] => Text2
[children] => Array
(
[0] => Array
(
[pid] => 500
[map] => 139.525390625, 35.797920227051
[id] => 5751
[parentId] => 5750
[text] => Text2.1
)
[1] => Array
(
[pid] => 502
[map] => 15, 17
[id] => 5751
[parentId] => 5750
[text] => Text2.1
)
[2] => Array
(
[pid] => 1157
[map] => 7.8320698738098, 48.023639678955
[id] => 5754
[parentId] => 5750
[text] => Text2.2
)
)
)
)
)
Ожидаемый результат есть. Здесь я использую :
в качестве разделителя
Array
(
[pid] => 10000
[map] => 11, 11
[id] => 5740
[parentId] => 5739
[text] => Text1
[children] => Array
(
[0] => Array
(
[pid] => 600
[map] =>
[id] => 5741
[parentId] => 5740
[text] => Adv
[children] => Array
(
[0] => Array
(
[pid] => 620 : 621
[map] => 115.43271636963, 28 : 1, 2
[id] => 5745
[parentId] => 5741
[text] => Text1.1
)
[1] => Array
(
[pid] => 1748
[map] => 11.43, 28
[id] => 5746
[parentId] => 5741
[text] => Text1.2
)
)
)
[1] => Array
(
[pid] => 700
[map] => 15, 17
[id] => 5750
[parentId] => 5740
[text] => Text2
[children] => Array
(
[0] => Array
(
[pid] => 500 : 502
[map] => 139.525390625, 35.797920227051 : 15, 17
[id] => 5751
[parentId] => 5750
[text] => Text2.1
)
[1] => Array
(
[pid] => 1157
[map] => 7.8320698738098, 48.023639678955
[id] => 5754
[parentId] => 5750
[text] => Text2.2
)
)
)
)
)
Я перепробовал много кода
одна из них функция array_merge_recursive
Также
function super_unique($array)
{
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
foreach ($result as $key => $value)
{
if ( is_array($value) )
{
$result[$key] = super_unique($value);
}
}
return $result;
}
Также я попробовал из этого решения Проверь это
Спасибо заранее, дайте мне знать, если есть какая-либо функция
Там нет ни одной функции, которая может сделать это для вас. Подход, который я выбрал:
Определите уровень, на котором нужно объединиться, когда нет 'children'
введите текущий элемент массива; в этом случае мы должны выполнить рекурсивный шаг, чтобы изучить более глубокие дочерние элементы.
Выполните итерацию по дочерним элементам и выполните другой рекурсивный шаг, если он содержит 'children'
ключ.
Создайте временный массив, в котором хранятся все возможные значения для каждого ключа в дочерних элементах, и удалите эти элементы из основного массива.
Перестройте основной массив с элементами из временного массива.
Код:
function recursive_group(array &$arr)
{
if (array_key_exists('children', $arr)) {
// 1. perform recursive step
recursive_group($arr['children']);
return;
}
$groups = [];
foreach ($arr as $key => &$subarr) {
if (array_key_exists('children', $subarr)) {
// 2. perform another recursive step
recursive_group($subarr['children']);
} elseif (isset($subarr['id'])) {
// 3. build temporary array
$id = $subarr['id'];
foreach ($subarr as $param_name => $param_value) {
if ($param_name != 'id') {
$groups[$id][$param_name][] = $param_value;
}
}
// 3. remove from main array
unset($arr[$key]);
}
}
if ($groups) {
// 4. rebuild main array
foreach ($groups as $id => $params) {
$tmp = ['id' => $id];
foreach ($params as $param_name => $param_values) {
$tmp[$param_name] = join(' : ', $param_values);
}
$arr[] = $tmp;
}
}
}
Других решений пока нет …