2013-02-28 59 views
5

Tôi lập trình cho một phương thức API chấp nhận một số đối số biến. Phương thức API (xem bên dưới) sử dụng func_get_args. Tôi gói API, và muốn có thể vượt qua một mảng kết hợp thay vì truyền các khóa/giá trị của mảng làm tham số; tức là filter(key1,value1,key2,value2 ...)Làm thế nào để truyền mảng tới hàm sử dụng hàm func_get_args để lấy tham số

Tôi có quyền truy cập mã nguồn vào API, nhưng rất tiếc là tôi không thể thay đổi nguồn.
Tôi đã xem call_user_func_array, mà tôi tin rằng nên/sẽ vượt qua một mảng như là một tập các đối số (mặc dù không phải là một mảng kết hợp). filter là một phương thức của một đối tượng - Tôi không biết cách chuyển một phương thức như một cuộc gọi lại. Tôi cũng không biết nếu có một cách sạch sẽ để bọc API này. Bất kỳ và tất cả các trợ giúp được đánh giá cao.

<?php 

public function &filter() { 
     $filter = new QueryFilter($this->queryhandler, $this); 
     $args = func_get_args(); 
     $filter->applyFilter($this->getFilters($args)); 
     return $filter; 
    } 
+0

Thỏa thuận với 'khóa1',' khóa2' là gì? 'func_get_args' cung cấp một mảng được đánh số theo số, nơi các khóa được xác định trước. – Jon

+0

Bây giờ nó có ý nghĩa. Đã thêm câu trả lời. – Jon

+0

Hàm 'filter' lấy tên trường cơ sở dữ liệu và giá trị trường. Đó là lý do tại sao tôi muốn sử dụng một mảng kết hợp. Mảng kết hợp sẽ cần phải được thao tác để các khóa và giá trị sẽ nằm trong một mảng không liên kết, ví dụ: lấy mảng ('key1' => 'value1', 'key2' => 'value2') và tạo mảng ('key1', 'value1', 'key2', 'value2' ..) mà tôi có thể làm, nhưng tôi không chắc chắn cách chuyển phương thức này thành hàm gọi lại. Tôi không chắc chắn nếu call_user_func_array là cách chính xác để làm điều đó. –

Trả lời

4

Bạn có thể có một wrapper mà phải mất một mảng và "flattens" các phím và các giá trị:

function wrapper(array $params) { 
    $flat = array(); 
    foreach ($params as $k => $v) { 
     $flat[] = $k; 
     $flat[] = $v; 
    } 

    return call_user_func_array('filter', $flat); 
} 

Ở trên giả định rằng filter là một chức năng miễn phí, mà trong trường hợp của bạn là không đúng sự thật . Để chỉ định phương thức làm gọi lại, hãy sử dụng cú pháp array($object, 'filter') với call_user_func_array để gọi phương thức filter trên $object.

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