Ошибка в том, что $curr_parent не возвращается к предыдущему значению.
Обычно рекурсивные скрипты пишут так:
function my_array_walk($array, $parent = 0) {
global $final_result;
foreach ($array as $item) {
$final_result[$parent][] = [
'id' => $item['data']['id'],
'name' => $item['text'],
'parent' => $parent,
];
if (count($item['children']) > 0) {
my_array_walk($item['children'], $item['data']['id']);
}
}
}
Т.е $parent мы передаем в вызов функции, и тогда, когда функция возвращается, $parent остается правильный.
Итоговый результат:
pastebin.com/tkgpHUbP