Recursividad en PHP

Hoy vamos a trabajar algo con lo que me he encontrado de frente en una entrevista, cuando me pidieron que hiciera un algoritmo recursivo, y me di cuenta de que no había hablado sobre la recursividad en PHP, de modo que vamos a ello.

La recursividad en PHP se da cuando una función se llama a si misma, es decir cuando hay una llamada a la función en el código que tiene su ámbito para ello se debe de cambiar el argumento con el que trabajamos. Algo parecido a esto de forma muy esquematica:

function recursiva($arg){
	recrusiva ($arg2);
}

Como toda función esta debe de ser invocada para que se ejecute el código que guarda.

Pero como siempre veamos algún ejemplo de todo esto. Sin duda alguna uno de los más comunes es el del número factorial:

function factorial($n){
    if($n==1)
      	return 1;
    else
      	return $n * factorial($n-1);
}

$resultado = factorial(3);
echo $resultado

Como vemos se invoca a la función factorial que recibe como argumento $n, la función comprueba si $n es uno y si no lo es multiplica el valor de $n por la invocación de si misma cambiando el argumento por $n-1 de este modo se va haciendo una especie de bucle que se recorre hasta que termina de calcular el factorial, es decir hasta $n=1.

Cualquiera con algo de conocimientos de programación, podría decir que el problema del factorial se puede resolver por ejemplo con un bucle while o con un for, y es cierto pero hay muchas situaciones que solo se pueden resolver por medio de esta recursividad, como por ejemplo si tenemos un árbol de arrays numéricos y queremos sumar todos los números. En ese caso debemos de hacer una función recursiva similar a la siguiente:

$var = array (
	1,
	2,
	5,
	8,
	array(2,3,
		array(1,2))
	);

function recorrido($arg){
	$suma = 0;
	foreach ($arg as $key => $value) {
		if (is_array($value)){
			$array2 = $arg[$key];
			$suma = $suma + recorrido($array2);
		}else {
			$suma = $suma + $value;
		}
	}
	return $suma;
}

$total = recorrido($var);
echo $total;

Aquí declaramos un array de arrays que es con el que vamos a trabajar, después definimos la función recursiva, que consiste en un foreach que recorre el array y donde elemento a elemento se va analizando si este es o no un array, si no lo es suma el valor al resultado total, y si lo es crea un argumento para llamarse a si misma y continuar haciendo recorriendo el array en profundidad.

En el ejemplo dado nos da como resultado 24 que es el resultado de sumar todos los elementos del array principal y sus ramificaciones.