2010-03-01 11 views
5

Ho il seguente codice PHP che lavora fuori le possibili combinazioni da un insieme di matrici:Come si memorizzano i risultati di questa funzione ricorsiva?

function showCombinations($string, $traits, $i){ 

    if($i >= count($traits)){ 

     echo trim($string) . '<br>'; 

    }else{ 

     foreach($traits[$i] as $trait){ 
      showCombinations("$string$trait", $traits, $i + 1); 
     } 

    } 

} 

$traits = array(
      array('1','2'), 
      array('1','2','3'), 
      array('1','2','3') 
      ); 

showCombinations('', $traits, 0); 

Tuttavia, il mio problema è che ho bisogno di memorizzare i risultati in un array per l'elaborazione successiva piuttosto che stamparle fuori ma non riesco a vedere come questo può essere fatto senza usare una variabile globale.

Qualcuno sa di un modo alternativo per ottenere qualcosa di simile o modificare questo per darmi risultati che posso usare?

risposta

11

Restituirli. Make showCombinations() restituisce un elenco di elementi. Nel primo caso si restituisce solo un articolo, nell'altro caso ricorsivo si restituisce un elenco con tutte le liste restituite unite. Ad esempio:

function showCombinations(...) { 
    $result = array(); 
    if (...) { 
     $result[] = $item; 
    } 
    else { 
     foreach (...) { 
      $result = array_merge($result, showCombinations(...)); 
     } 
    } 
    return $result; 
} 
+0

Grazie per questo, ieri ho avuto un po 'di blocco mentale - anche molto veloce! – Tom

+0

Grazie per questo. Stavo passando un array di risultati per riferimento, ma questo sembra molto più pulito. –

+0

grazie mille, salvavita! – Liko

0

memorizzare i risultati in una variabile $ _SESSION.

0

Utilizzando la portata modificatore variabile static potrebbe funzionare. In alternativa, puoi utilizzare i riferimenti, ma questa è solo un'altra variabile da passare. Funziona con "sintassi di ritorno".

function showCombinations($string, $traits, $i){ 
    static $finalTraits; 
    if (!is_array($finalTraits)) { 
     $finalTraits = array(); 
    } 
    if($i >= count($traits)){ 

     //echo trim($string) . '<br>'; 
     $finalTraits[] = $string; 

    } else { 

     foreach($traits[$i] as $trait){ 
      showCombinations("$string$trait", $traits, $i + 1); 
     } 

    } 
    return $finalTraits; 
} 

$traits = array(
      array('1','2'), 
      array('1','2','3'), 
      array('1','2','3') 
      ); 

echo join("<br>\n",showCombinations('', $traits, 0)); 

Naturalmente, questo funzionerà come previsto esattamente una volta, prima che la staticità della variabile raggiunge con voi. Pertanto, questa è probabilmente una soluzione migliore:

function showCombinations($string, $traits, $i){ 
    $finalTraits = array(); 
    if($i >= count($traits)){ 
     $finalTraits[] = $string; 
    } else { 
     foreach($traits[$i] as $trait){ 
      $finalTraits = array_merge(
           $finalTraits, 
           showCombinations("$string$trait", $traits, $i + 1) 
           ); 
     } 
    } 
    return $finalTraits; 
} 
+0

Sarebbe divertente eseguire il debug se si chiama la funzione più volte. –

+0

Punto già affrontato. – Dereleased

1

In aggiunta alle altre risposte, si potrebbe passare l'indirizzo di una matrice intorno all'interno della vostra funzione, ma devo dire che questo non è quasi il modo migliore per farlo.

0

sebbene la soluzione di Lukáš sia la più pura in quanto non ha effetti collaterali, può essere inefficace su grandi input, perché costringe il motore a generare costantemente nuovi array. Ci sono due modi che sembrano essere meno memoria che consumano

  • dispone di un array risultati passati per riferimento e sostituire la chiamata eco con $ provocare [] =
  • (preferito) avvolgere tutta la storia in una classe e utilizzare $ this-> comportare quando opportuno

l'approccio di classe è particolarmente piacevole quando viene utilizzato insieme a iteratori php

0
public function pageslug_genrator($slug,$cat){ 


    $page_check=$this->ci->cms_model->show_page($slug); 

     if($page_check[0]->page_parents != 0){ 

     $page_checks=$this->ci->page_model->page_list($page_check[0]->page_parents); 
     $cat[]=$page_checks['re_page'][0]->page_slug; 
     $this->pageslug_genrator($page_checks['re_page'][0]->page_slug,$cat);  

     } 
    else 
     { 
     return $cat; 

     } 
    } 

questa funzione doesnt restituire qualsiasi valore ma quando sto facendo print_r $ cat è

Problemi correlati