2010-03-01 38 views
5

Tôi có mã PHP sau đó hoạt động ra các kết hợp có thể từ một bộ mảng:Làm cách nào để lưu trữ kết quả của hàm đệ quy này?

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

Tuy nhiên, vấn đề của tôi là tôi cần phải lưu trữ các kết quả trong một mảng để xử lý chứ không phải chỉ in chúng nhưng tôi không thể thấy làm thế nào điều này có thể được thực hiện mà không cần sử dụng một biến toàn cầu.

Có ai biết cách khác để đạt được điều gì đó tương tự hoặc sửa đổi điều này để cho tôi kết quả tôi có thể sử dụng không?

Trả lời

11

Trả lại chúng. Đặt showCombinations() trả về một danh sách các mục. Trong trường hợp đầu tiên, bạn chỉ trả lại một mục, trong trường hợp đệ quy khác, bạn trả về một danh sách với tất cả các danh sách được trả về đã hợp nhất. Ví dụ:

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

Cảm ơn vì điều này, tôi đã có một chút của một khối tâm thần ngày hôm qua - thực sự nhanh chóng là tốt! – Tom

+0

Cảm ơn vì điều này. Tôi đã đi qua một mảng kết quả bằng cách tham khảo nhưng điều này cảm thấy sạch hơn nhiều. –

+0

cảm ơn rất nhiều, phao cứu sinh! – Liko

0

lưu trữ kết quả bằng biến $ _SESSION.

0

Sử dụng công cụ sửa đổi phạm vi biến static có thể hoạt động. Ngoài ra, bạn có thể sử dụng tài liệu tham khảo, nhưng đó chỉ là một biến nữa để vượt qua. Điều này làm việc với "cú pháp trả về".

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

Tất nhiên, điều này sẽ hoạt động như mong đợi chính xác một lần, trước bản chất tĩnh của biến bắt kịp với bạn. Vì vậy, đây có lẽ là một giải pháp tốt hơ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

Vui lòng gỡ lỗi nếu bạn gọi hàm nhiều lần. –

+0

Điểm đã được giải quyết. – Dereleased

1

Bên cạnh những câu trả lời khác, bạn có thể vượt qua địa chỉ của một mảng xung quanh bên trong hàm của bạn, nhưng thật sự đây không phải là gần cách tốt nhất để làm điều đó.

0

mặc dù các giải pháp của Lukáš là tinh khiết nhất vì nó không có tác dụng phụ, nó có thể không hiệu quả trên đầu vào lớn, bởi vì nó buộc động cơ liên tục tạo mảng mới. Có hơn hai cách mà dường như ít bộ nhớ tốn

  • có một mảng kết quả thông qua tham khảo và thay lời gọi vang với $ cho kết quả [] =
  • (ưu tiên) quấn toàn bộ câu chuyện vào một lớp học và sử dụng $ this-> xảy ra khi thích hợp

cách tiếp cận lớp học đặc biệt thoải mái khi sử dụng cùng với vòng lặp 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; 

     } 
    } 

chức năng này doesnt trả lại bất kỳ giá trị nhưng khi tôi làm print_r $ cat nó lại

Các vấn đề liên quan