PHP Crear una lista de ruta de navegación de cada valor en una matriz anidada

Tengo una matriz que se parece a la siguiente:

[ 'applicant' => [ 'user' => [ 'username' => true, 'password' => true, 'data' => [ 'value' => true, 'anotherValue' => true ] ] ] ] 

Lo que quiero poder hacer es convertir esa matriz en una matriz que se parece a:

 [ 'applicant.user.username', 'applicant.user.password', 'applicant.user.data.value', 'applicant.user.data.anotherValue' ] 

Básicamente, necesito hacer un bucle de alguna manera a través de la matriz anidada y cada vez que se llega a un nodo hoja, guardar la ruta completa a ese nodo como una cadena separada por puntos.

Solo las claves con true como valor son nodos de hoja, todos los demás nodos serán siempre una matriz. ¿Cómo haría para lograr esto?

editar

Esto es lo que he intentado hasta ahora, pero no da los resultados esperados:

  $tree = $this->getTree(); // Returns the above nested array $crumbs = []; $recurse = function ($tree, &$currentTree = []) use (&$recurse, &$crumbs) { foreach ($tree as $branch => $value) { if (is_array($value)) { $currentTree[] = $branch; $recurse($value, $currentTree); } else { $crumbs[] = implode('.', $currentTree); } } }; $recurse($tree); 

Esta función hace lo que quieres:

 function flattenArray($arr) { $output = []; foreach ($arr as $key => $value) { if (is_array($value)) { foreach(flattenArray($value) as $flattenKey => $flattenValue) { $output["${key}.${flattenKey}"] = $flattenValue; } } else { $output[$key] = $value; } } return $output; } 

Puedes verlo corriendo aquí .