2010-10-06 16 views
5
$temp = array(); 
function show_keys($ar) 
{ 
    foreach ($ar as $k => $v) 
    { 
     $temp[] = $k; 
     if (is_array($ar[$k])) 
     { 
      show_keys ($ar[$k]); 
     } 
    } 

    return $temp; 
} 

Próbowałem użyć tej funkcji, ale nadal zwraca tylko pierwszy klucz.Potrzebuję array_keys_recursive()

+0

Ta rekurencja jest nieskończony w wielu przypadkach. – Svisstack

+2

Uwaga dotycząca stylu: Nie wywołuj zmiennych 'temp' lub' tmp', ** szczególnie ** w globalnej przestrzeni nazw, co prowadzi do nieporozumień. Nazwy powinny być opisowe; nazwij go 'kluczami', ponieważ to jest to, co zawiera. – meagar

Odpowiedz

1

Twoja tablica $temp jest globalna. Aby zrobić, jest dostępne w funkcji, której potrzebujesz:

global $temp; 

na początku funkcji.

Obecnie każde wywołanie funkcji tworzy nową tablicę z nazwą $temp i kiedy wreszcie powrócić z funkcji do swojego rozmówcy, utworzonego w pierwszym naborze $temp jest zwracany, który ma tylko klucze twojego pierwszy poziom.

Należy pamiętać, że używanie zmiennych globalnych nie jest dobrym programowaniem. Musisz przekazać tablicę jako argument do wywołań rekursywnych i zmodyfikować przekazaną tablicę, dodając klucze znalezione w każdej iteracji, tak jak zrobiły to Alexander i John.

+0

Bez różnicy, wygląda na to, że najpierw zaakceptował $ temp. – HyderA

+0

Masz prawdopodobnie rację, to był krok bliżej rozwiązania. – HyderA

4

Głównym problemem jest odrzucenie wyników rekursywnych wywołań show_keys(). Nic nie robisz z wartością zwracaną.

Komentarze są wstawiane.

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; 
} 
2

To może załatwić sprawę?

Musisz albo przynieść $ temp jako globalny, albo odebrać zwróconą wartość z każdej rekursji. A chcielibyśmy uniknąć zmiennych globalnych, więc scalamy wartości z każdego wywołania rekursji z poprzednimi zebranymi wartościami.

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; 
} 
+0

Tak, udało się .. dziękuję, panie! – HyderA

0

Ofcause ta funkcja jest nieskończona. Ale moim zadaniem jest pomóc ci)

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; 
} 
6

Korzystanie SPL, zapętlenie nad klawiszy jest dość łatwe (przechowywać je w innym tablicy jeśli chcesz):

<?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); 
} 
?> 
+0

Niesamowita metoda robienia rzeczy :) I wiele skutecznych. Dzięki! –

2

widzę dużo zbyt skomplikowane rozwiązania tutaj ...

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; 
} 
0

Pytanie jest niejednoznaczne, ponieważ nie podano danych wejściowych i oczekiwanych wyników.

Rozważmy następujący przykład tablicy:

$array = [ 
    'first' => [ 
     'second' => [ 
      'third' => 'three', 
     ], 
     'deuxième' => 'two', 
    ], 
]; 

Wszystkie inne rozwiązania dotychczas świadczenia spłaszczoną jednowymiarowy listy tablicy kluczy.

$keys = [ 
    'first', 
    'second', 
    'third', 
    'deuxième', 
]; 

Jednak miałem potrzebę array_keys_recursive funkcji, które zachowania hierarchii.

$keys = [ 
    'first' => [ 
     'second' => [ 
      'third', 
     ], 
     'deuxième', 
    ], 
]; 

dla nikogo szukasz podobnej potrzebie, oto moje rozwiązanie:

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