2010-03-01 15 views
5

Tengo el siguiente código PHP que funciona las combinaciones posibles de un conjunto de matrices:¿Cómo almaceno los resultados de esta función recursiva?

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); 

Sin embargo, mi problema es que necesito para almacenar los resultados en una matriz para su posterior procesamiento en lugar de imprimirlos pero no puedo ver cómo se puede hacer esto sin usar una variable global.

¿Alguien sabe de una manera alternativa de lograr algo similar o modificar esto para darme los resultados que puedo usar?

Respuesta

11

Devuélvalos. Haga showCombinations() devolver una lista de artículos. En el primer caso, solo devuelve un artículo, en el otro caso recursivo, devuelve una lista con todas las listas devueltas fusionadas. Por ejemplo:

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

Gracias por esto, estaba teniendo un bloqueo mental ayer, ¡muy rápido también! – Tom

+0

Gracias por esto. Estaba pasando una matriz de resultados por referencia, pero esto se siente mucho más limpio. –

+0

muchas gracias, salvavidas! – Liko

0

almacenar los resultados en una variable $ _SESSION.

0

Uso del modificador de alcance variable de static podría funcionar. Alternativamente, podría emplear referencias, pero esa es solo una variable más para aprobar. Esto funciona con la "sintaxis de retorno".

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)); 

Por supuesto, esto funcionará como se esperaba exactamente una vez, antes de que la naturaleza estática de la variable te alcance. Por lo tanto, esto es probablemente una mejor solución:

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

Sería divertido depurarlo si llama a la función varias veces. –

+0

Punto ya abordado. – Dereleased

1

Además de las otras respuestas, que podrían pasar la dirección de una matriz por el interior de su función, pero la verdad es que esto no es casi la mejor manera de hacerlo.

0

aunque la solución de Lukáš es la más pura, ya que no tiene efectos secundarios, puede ser ineficaz en grandes entradas, ya que obliga al motor a generar constantemente nuevas matrices. Hay dos maneras más que parecen ser menos memoria que consume

  • tienen una matriz resultados pasa por referencia y vuelva a colocar la llamada eco con $ resultado [] =
  • (preferido) envuelven toda la historia en una clase y usar $ this-> resultar en su caso

el enfoque de clase es especialmente agradable cuando se utiliza junto con iteradores 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; 

     } 
    } 

duerma esta función devuelve ningún valor pero cuando estoy haciendo print_r $ cat es

Cuestiones relacionadas