<?php

$array = [
  'a' => ['children' => ['b', 'c']],
  'b' => ['children' => ['ba', 'bb']],
  'c' => ['children' => []],
  'ba' => ['children' => []],
  'bb' => ['children' => ['bba']],
  'bba' => ['children' => []]
 ];

function expand(&$source, $item) {
	$result = ['children' => $item['children']]; 

	foreach($item['children'] as $key) {
		$result[$key] = expand($source, $source[$key]);
		$source[$key] = []; 
	}

	return $result;
}

foreach($array as $key => $value) {
	if(!empty($array[$key])) {
		$result[$key] = expand($array, $value);
	}
}

print_r($result);