Mirá, estoy corto de tiempo en este momento para realizar un script, tal vez más tarde pueda meterle un poco de mano, pero se me ocurrió esto:
Cargas de la bd todos los items con id_padre=0. Recorres estos valores cargados uno por uno. Para cada uno, cargas de la bd todos los items con id_padre=id_item_actual (entendes?) y entonces vas guardando los datos en una variable array. --> Recursivo
Una imagen te puede ayudar más: (cuando ya se está en el bucle, se encuentra una subcategoria y se empieza otro bucle, justamente se empieza OTRO bucle, para después completar el/los comenzados anteriormente. Con empezar bulce me refiero a llamar a una función cuando existan items con id_padre=item actual, asi quedaría Recursivo)

Cargas de la bd todos los items con id_padre=0. Recorres estos valores cargados uno por uno. Para cada uno, cargas de la bd todos los items con id_padre=id_item_actual (entendes?) y entonces vas guardando los datos en una variable array. --> Recursivo
Una imagen te puede ayudar más: (cuando ya se está en el bucle, se encuentra una subcategoria y se empieza otro bucle, justamente se empieza OTRO bucle, para después completar el/los comenzados anteriormente. Con empezar bulce me refiero a llamar a una función cuando existan items con id_padre=item actual, asi quedaría Recursivo)
