Afaik, PHP не поддерживает этот синтаксис (было бы неплохо для будущей версии ..), поэтому вы должны поместить foreach снаружи и создать временный массив.
$cat["catName"] => [
foreach (Food::foodsByCategory($cat["catId"], $db) as $food):
"foodId" => $food["foodId"],
"foodName" => $food["foodName"],
"foodPrice" => $food["foodPrice"]
endforeach;
]
становится
$content = array();
// content creation
foreach (Food::foodsByCategory($cat["catId"], $db) as $food):
content["foodId"] => $food["foodId"],
content["foodName"] => $food["foodName"],
content["foodPrice"] => $food["foodPrice"]
endforeach;
// content insertion
$cat["catName"] = $content;
На самом деле я считаю, что разделение создания и вставки также более ясное.