recursive - php buscar en array multidimensional
Necesito un array_keys_recursive() (7)
Al usar SPL, hacer un bucle sobre las teclas es bastante fácil (guárdelas en otra matriz si lo desea):
<?php
$arr = array_fill(0,8,range(0,3));
var_dump($arr);
foreach( new RecursiveIteratorIterator(
new RecursiveArrayIterator($arr),
RecursiveIteratorIterator::SELF_FIRST)
as $key => $value){
var_dump($key);
}
?>
$temp = array();
function show_keys($ar)
{
foreach ($ar as $k => $v )
{
$temp[] = $k;
if (is_array($ar[$k]))
{
show_keys ($ar[$k]);
}
}
return $temp;
}
Intenté usar esa función pero aún así solo devuelve la primera clave.
Debido a que esta función es infinita. Pero mi tarea es ayudarte)
function show_keys($ar, $temp = array())
{
if (!empty($ar)) {
foreach ($ar as $k => $v )
{
$temp[] = $k;
if (is_array($ar[$k]))
{
$temp += show_keys($ar[$k], $temp);
}
}
}
return $temp;
}
El problema principal es que está descartando los resultados de las show_keys()
recursivas show_keys()
. No haces nada con el valor de retorno.
Los comentarios estan en linea.
function show_keys($ar)
{
// Create new temp array inside function so each recursive call gets
// a separate instance.
$temp = array();
foreach ($ar as $k => $v )
{
$temp[] = $k;
// Use $v instead of $ar[$k].
if (is_array($v))
{
// Combine results of recursive show_keys with $temp.
$temp = array_merge($temp, show_keys($v));
}
}
return $temp;
}
Esto podría hacer el truco?
Tendría que traer $ temp como global, o recoger el valor devuelto de cada recursión. Y nos gustaría evitar las variables globales, por lo que fusionamos los valores de cada llamada de recursión con los valores recopilados anteriores.
function show_keys($ar)
{
$temp = array();
foreach ($ar as $k => $v )
{
$temp[] = $k;
if (is_array($ar[$k]))
{
$temp = array_merge(show_keys ($ar[$k]), $temp);
}
}
return $temp;
}
Su matriz $temp
es global. Para hacer es accesible en la función que necesita:
global $temp;
al comienzo de la función.
Actualmente, cada invocación de la función crea una nueva matriz con el nombre $temp
y cuando finalmente regresas de la función a su llamador, se devuelve la $temp
que creaste en tu primera llamada, que solo tiene las teclas de tu primer nivel .
Tenga en cuenta que el uso de variables globales no es una buena programación. Debe pasar su matriz como argumento a sus llamadas recursivas y modificar la matriz pasada agregando las claves que se encuentran en cada iteración como lo han hecho Alexander y John.
Veo muchas soluciones demasiado complicadas aquí ...
function array_keys_r($array) {
$keys = array_keys($array);
foreach ($array as $i)
if (is_array($i))
$keys = array_merge($keys, array_keys_r($i));
return $keys;
}
La pregunta es ambigua porque no especificó su entrada y salida esperada.
Considere esta matriz de ejemplo:
$array = [
''first'' => [
''second'' => [
''third'' => ''three'',
],
''deuxième'' => ''two'',
],
];
Todas las otras soluciones hasta ahora proporcionan una lista de claves aplanadas de matriz unidimensional.
$keys = [
''first'',
''second'',
''third'',
''deuxième'',
];
Sin embargo, tenía una necesidad de una función array_keys_recursive
que preservara la jerarquía.
$keys = [
''first'' => [
''second'' => [
''third'',
],
''deuxième'',
],
];
Para cualquier otra persona que busque una necesidad similar, esta es mi solución:
function array_keys_recursive(array $array) : array
{
foreach ($array as $key => $value) {
if (is_array($value)) {
$index[$key] = array_keys_recursive($value);
} else {
$index []= $key;
}
}
return $index ?? [];
}