Das liegt daran, dass Sie die Kategorien immer noch im Array haben, wenn Sie sie bereits zugewiesen haben. Sie können die Funktion ausführen, bei der Sie das Argument als Referenz übergeben, und in der foreach-Schleife die Möglichkeit haben, das Array aus dieser bereits zugewiesenen Kategorie zu löschen. Einfache Implementierung unten.
function getChildren(&$rows, $p = 0) {
$r = array();
foreach($rows as $row_id => $row) {
if ($row['parent_node']==$p) {
$r[$row['product_category_code']] = getChildren($rows, $row['product_category_code']);
unset($rows[$row_id]);
}
}
return $r;
}