2010-08-14 12 views
5

Dopo due ore di grattacapi e googling - sono bloccato!PHP - Errore quando si restituisce un array da una funzione ricorsiva

Come per il titolo, sto provando a restituire un array che si costruisce man mano che la funzione scorre. Voglio solo restituire la variabile di matrice sul else tuttavia non coopererà. Ritorna semplicemente come vuoto dalla funzione, tuttavia nel resto posso stampare e mostrare come previsto. Semplicemente non restituirà la matrice nella variabile $ open_array. Qualsiasi idea (o abuso) sarebbe molto apprezzata!

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

Non vedo '$ other_variable' in via di definizione del perimetro della funzione. – NullUserException

+0

Anche il '[$ val-> id' non ha una sintassi valida. Funziona anche questo? – NullUserException

+0

Cosa? Non usi la ricorsione per costruire array? Da che pianeta vieni, moronia? –

risposta

3

Nella parte "then", si assegna a $ open, ma non si restituisce mai quel valore. Quindi non puoi davvero aspettarti di ottenere qualcosa in cambio, tranne nei casi in cui inserisci la parte else, ma poi è una versione invariata.

Quindi, ecco cosa dovrei fare: andrei con una versione senza restituire $ open mai. Inizializza $ aperto prima di chiamare la funzione. Passalo. Quindi modificarlo se necessario.

Non c'è davvero alcun motivo per restituire questo $ valore aperto poiché lo si sta passando per riferimento comunque, cioè dovrebbe sempre essere lo stesso oggetto che si sta manipolando (e in quei casi che non lo è, è probabilmente un bug).

In questo modo, è possibile concentrarsi sulla logica di flusso con le chiamate e i ritorni e assicurarsi di parlare sempre con lo stesso datastructure.

aggiornamento

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

Capisco il tuo commento grazie :). Ma per me non ha ancora senso che io possa stampare_r ($ open) dentro il resto, stampa l'array come mi aspetto, ma non posso restituirlo? – Hayden

+0

prova a restituirlo anche nella parte "then" (vedi aggiornamento). altrimenti il ​​valore è impostato nella parte "then", passato correttamente alla chiamata ricorsiva, quindi è presente anche nella parte "else", ma una volta restituita la parte "if" della precedente chiamata, non viene restituita. – Nicolas78

+0

Bingo che ha funzionato bene. Grazie! – Hayden

Problemi correlati