Todas esas incógnitas se resuelven aplicando la misma solución: recursividad.
Como sea, un array u objeto es un contenedor de propiedades, clave/valor, etc. por lo tanto se pueden iterar con foreach() de manera sencilla.
De ahí a que sepas exactamente por dónde empezar o hasta dónde iterar ya tiene que ver con la estructura lógica de control que plantees, y sobre todo eso debe considerarse en la solución recursiva que apliques.