Itu karena Anda masih memiliki kategori dalam larik ketika Anda sudah menetapkannya. Apa yang dapat Anda lakukan adalah melakukan fungsi di mana Anda meneruskan argumen sebagai referensi, dan loop foreach memiliki kemampuan untuk menghapus array dari kategori yang sudah ditetapkan. Implementasi sederhana di bawah ini.
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;
}