Объединить значение многомерного массива

У меня есть многомерный выход массива, как это, как показано ниже, в котором

я хочу объединить ценности 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;
}

Также я попробовал из этого решения Проверь это

Спасибо заранее, дайте мне знать, если есть какая-либо функция

2

Решение

Там нет ни одной функции, которая может сделать это для вас. Подход, который я выбрал:

  1. Определите уровень, на котором нужно объединиться, когда нет 'children' введите текущий элемент массива; в этом случае мы должны выполнить рекурсивный шаг, чтобы изучить более глубокие дочерние элементы.

  2. Выполните итерацию по дочерним элементам и выполните другой рекурсивный шаг, если он содержит 'children' ключ.

  3. Создайте временный массив, в котором хранятся все возможные значения для каждого ключа в дочерних элементах, и удалите эти элементы из основного массива.

  4. Перестройте основной массив с элементами из временного массива.

Код:

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;
}
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector