2010-08-14 17 views
5

Po dwóch godzinach drapania głowy i szukania w Google - utknąłem!PHP - Błąd podczas zwracania tablicy z funkcji rekursywnej

Zgodnie z tytułem próbuję zwrócić tablicę, która jest tworzona podczas wykonywania pętli funkcji. Chcę tylko zwrócić zmienną tablicową na inne, ale nie będzie ona współpracować. Po prostu zwraca wartość pustą od funkcji, jednak w innym można ją wydrukować i wyświetlić zgodnie z oczekiwaniami. Po prostu nie zwróci tablicy w zmiennej $ open_array. Wszelkie pomysły (lub nadużycia) będą mile widziane!

function find_parent($number, $open = false) { 
    if(isset($other_variable[$number])) { 
     foreach($other_variable[$number] as $val) { 
      $open[$val->id] = [$val->id; 
      $open = find_parent([$val->id, $open); 

     } 
    } 
    else { 
    return $open; 
    } 
} 

$open_array = find_parent($number); 
print_r($open_array); 
+0

nie widzę '$ other_variable' jest określony zakres funkcji. – NullUserException

+0

Również '[$ val-> id' nie ma poprawnej składni. Czy to nawet działa? – NullUserException

+0

Co? Nie używasz rekursji do budowania tablic? Z jakiej jesteś planety, moronie? –

Odpowiedz

3

W części "wtedy" przypisujesz wartość $ open, ale nigdy nie zwracasz tej wartości. Tak więc nie można oczekiwać, że kiedykolwiek uda się coś odzyskać, z wyjątkiem przypadków, w których wpisuje się część inną, ale jest to niezmieniona wersja.

Oto, co powinienem zrobić: wybrałbym wersję bez zwracania $ open. Zainicjuj $ open przed wywołaniem funkcji. Przekaż dalej. Następnie zmodyfikuj w razie potrzeby.

Nie ma powodu, aby zwracać tę wartość otwartą $, ponieważ i tak przekazujesz ją przez referencję, tzn. Zawsze powinien to być ten sam obiekt, którym manipulujesz (aw tych przypadkach, w którym nie jest, jest to prawdopodobnie błąd).

W ten sposób można skoncentrować się na logice przepływu za pomocą wywołań i zwrotów i zawsze należy rozmawiać z tą samą strukturą danych.

aktualizacja

function find_parent($number, $open = false) { 
    if(isset($other_variable[$number])) { 
     foreach($other_variable[$number] as $val) { 
      $open[$val->id] = [$val->id; 
      $open = find_parent([$val->id, $open); 
      return $open; // INSERTED 
     } 
    } 
    else { 
    return $open; 
    } 
} 
+0

Rozumiem twój komentarz dziękuję :). Ale nadal nie ma dla mnie sensu, że mogę print_r ($ open) wewnątrz tego, co wypisuje tablicę, jak się tego spodziewam, ale nie mogę jej zwrócić? – Hayden

+0

spróbuj zwrócić także w części "wtedy" (patrz aktualizacja). w przeciwnym razie wartość jest ustawiana w części "wtedy", poprawnie przekazywana do wywołania rekurencyjnego, więc jest również obecna w części "else", ale po zwróceniu części "if" poprzedniego wywołania nie jest zwracana. – Nicolas78

+0

Bingo, które działało. Dziękuję Ci! – Hayden

Powiązane problemy