PHP: получить родительское дочернее значение

124
6

У меня есть такой массив

array (
0 =>
array (
'id' => '1',
'job_id' => 'J1',
'parent_id' => '0',
),
1 =>
array (
'id' => '2',
'job_id' => 'J2',
'parent_id' => '0',
),
2 =>
array (
'id' => '3',
'job_id' => 'J3',
'parent_id' => '1',
),
3 =>
array (
'id' => '4',
'job_id' => 'J4',
'parent_id' => '2',
),
4 =>
array (
'id' => '5',
'job_id' => 'J5',
'parent_id' => '3',
),
5 =>
array (
'id' => '6',
'job_id' => 'J6',
'parent_id' => '1',
),
6 =>
array (
'id' => '8',
'job_id' => 'J8',
'parent_id' => '7',
),
)

Я показываю дочернюю запись, где parent_id упоминает с ней родительские записи

Выход

Array
(
[1] => Array
(
[job_id] => J1
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[job_id] => J3
[parent_id] => 1
[children] => Array
(
[0] => Array
(
[job_id] => J5
[parent_id] => 3
)
)
)

[1] => Array
(
[job_id] => J6
[parent_id] => 1
)

)

)

[2] => Array
(
[job_id] => J2
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[job_id] => J4
[parent_id] => 2
)
)
)

)

Теперь я хочу - если parent_id упомянут, но он недоступен в заданном массиве, тогда вы хотите показать записи в основном массиве в выводе не как дочерний массив

ожидая выхода

Array
(
[1] => Array
(
[job_id] => J1
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[job_id] => J3
[parent_id] => 1
[children] => Array
(
[0] => Array
(
[job_id] => J5
[parent_id] => 3
)

)

)

[1] => Array
(
[job_id] => J6
[parent_id] => 1
)

)

)

[2] => Array
(
[job_id] => J2
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[job_id] => J4
[parent_id] => 2
)

)

)
[3] => Array
(
[id] => 8
[job_id] => J8
[parent_id] => 7
)
)

Здесь id 7 не существует по ошибке, я хочу, чтобы он был как родительские записи с ключом id. Как это найти?

Код

function buildTree( $ar, $pid = 0 ) {
$op = array();
foreach( $ar as $item ) {
echo '<pre>';
//print_r($item);echo '<br>';//exit;
if( $item['parent_id'] == $pid ) {
$op[$item['id']] = array(
'job_id' => $item['job_id'],
'parent_id' => $item['parent_id']
);
// using recursion
$children = buildTree( $ar, $item['id'] );
//print_r($children);
$children = array_values($children);
if( $children ) {
$op[$item['id']]['children'] = $children;
}
}
}
return $op;
}

спросил(а) 2021-01-25T17:34:41+03:00 4 месяца, 4 недели назад
1
Решение
108

Вы можете добавить pid в новый массив чуть выше:

$ op = array; Поэтому каждый раз buildtree называется pid добавляется в новый массив. Вы можете добавить другие массивы в результирующий массив $ op после его возврата.

Это нужно сделать за пределами метода buildtree: проверьте, есть ли какой-либо элемент, у которого parent_id отсутствует в новом массиве, который был создан, если да, то добавьте этот элемент в $ op согласно требованию.

Надеюсь, это поможет.

ответил(а) 2021-01-25T17:34:41+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема