Всё элементарно. В PHP любой массив - ассоциативный, что соответствует объекту JSON.
Но, если индекс массива начинается с нуля и содержит только строго последовательные номера (0, 1, 2, 3 и т.д.), то для простоты он представляется как классический массив, в том числе и в JSON.
print json_encode(['a', 'b']); // ["a","b"]
print json_encode([0 => 'a', 1 => 'b']); // ["a","b"]
print json_encode([1 => 'a', 2 => 'b']); // {"1":"a","2":"b"}
У вас массив заполняется по индексам $term->tid, которые не образуют классической последовательности, поэтому и представляются объектом.
Ваш код можно переписать так:
$vid = 'digest';
$termDataAll = array_map(
fn($term) => [
'tid' => $term->tid,
'name' => $term->name,
'weight' => $term->weight,
'childs' => array_map(
fn($child) => [
'tid' => $child->tid,
'name' => $child->name,
'weight' => $child->weight
],
\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $term->tid, 1)
)
],
\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, 0, 1)
);
В результате должен получиться такой JSON
[
[
"tid": "11",
"name": "parent-1",
"weight": "7",
"childs": [
["tid": "14", "name": "child-1", "weight": "0"],
["tid": "19", "name": "child-2", "weight": "1"],
],
], [
"tid": "12",
"name": "parent-2",
"weight": "6",
"childs": [
["tid": "17", "name": "child-1", "weight": "0"],
["tid": "18", "name": "child-2", "weight": "1"]
]
]
]