valor recursive obtener multidimensional longitud length indice elemento buscar array_values array php arrays recursion multidimensional-array

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 ?? []; }