2010-08-14 32 views
5

Sau hai giờ gãi đầu và googling - tôi bị kẹt!PHP - Lỗi khi trả về một mảng từ hàm đệ quy

Theo tiêu đề tôi đang cố trả về một mảng được xây dựng khi hàm lặp lại. Tôi muốn chỉ trả về biến mảng trên cái khác, tuy nhiên nó sẽ không hợp tác. Nó chỉ đơn giản là trở về như trống đi từ chức năng, tuy nhiên trong người khác tôi có thể print_r nó và hiển thị như mong đợi. Nó chỉ đơn giản là sẽ không trả về mảng trong biến $ open_array. Bất kỳ ý tưởng (hoặc lạm dụng) sẽ được đánh giá cao!

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

Tôi không thấy '$ other_variable' được xác định trong phạm vi của hàm. – NullUserException

+0

Ngoài ra '[$ val-> id' không có cú pháp hợp lệ. Điều này thậm chí có chạy không? – NullUserException

+0

Cái gì? Bạn không sử dụng đệ quy để xây dựng mảng? Bạn đến từ hành tinh gì, moronia? –

Trả lời

3

Trong phần "sau đó", bạn gán cho $ mở, nhưng sau đó không bao giờ trả về giá trị đó. Vì vậy, bạn có thể không thực sự mong đợi để có được một cái gì đó trở lại, ngoại trừ trong những trường hợp mà bạn nhập vào một phần khác, nhưng sau đó nó là một phiên bản không thay đổi.

Vì vậy, đây là những gì tôi sẽ làm: Tôi sẽ đi với một phiên bản mà không cần phải trả $ mở bao giờ hết. Khởi tạo $ mở trước khi bạn gọi hàm. Vượt qua. Sau đó sửa đổi nó khi cần thiết.

Không có lý do nào thực sự trả về giá trị mở $ này vì bạn vẫn chuyển nó bằng tham chiếu, nghĩa là nó luôn là đối tượng mà bạn đang thao tác (và trong những trường hợp đó không phải là có thể là một lỗi).

Bằng cách này, bạn có thể tập trung vào logic luồng với các cuộc gọi và trả về của bạn, và chắc chắn bạn luôn nói chuyện với cùng một cơ sở dữ liệu.

cập nhật

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

Tôi hiểu nhận xét của bạn cảm ơn bạn :). Nhưng nó vẫn không có ý nghĩa với tôi rằng tôi có thể print_r ($ mở) bên trong khác nó in mảng như tôi mong đợi nó nhưng tôi không thể trả lại nó? – Hayden

+0

thử trả lại trong phần "sau đó" (xem cập nhật). nếu không giá trị được đặt trong phần "sau đó", được chuyển chính xác đến cuộc gọi đệ quy, vì vậy nó cũng xuất hiện trong phần "khác", nhưng một khi phần "if" của cuộc gọi trước đó được trả về, nó sẽ không được trả lại. – Nicolas78

+0

Bingo đã làm việc một điều trị. Cảm ơn bạn! – Hayden

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