2012-09-04 48 views
7

Tôi đang cố gắng tạo hàm để bắt đầu date_compare() là hàm usort cho một mảng và khóa cụ thể.Chuyển các đối số hàm tới một hàm bên trong?

function init_date_compare($key, $array) { 
    $key2 = $key; 
    function date_compare($a, $b) { 
     global $key2; 
     $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]); 
     return $t2 - $t1; 
    } 
    usort($array, "date_compare"); 
} 
$arr = array(array("Aug-2-2012"), array("June-2-2012")); 
$arr = init_date_compare(0, $arr); 
print_r($arr); 

đầu ra này:

Notice: Undefined index: in... 

(Vì vậy, về cơ bản null, các Phạm vi không làm việc).

Tôi không chắc chắn cách phạm vi hoạt động với các hàm bên trong các hàm, nhưng nếu tôi nhớ đúng, điều đó là có thể. Tôi đã cố gắng ném vào một số global s và khởi tạo $key2 nhưng tôi không thể làm việc này.

+0

Sẽ có ích nếu 'usort' và thân nhân của nó có thể vượt qua đối số gọi lại, eh. –

Trả lời

4

Lý do mã của bạn không hoạt động là vì global $key2; bên trong chức năng date_compare() sẽ không tìm kiếm trong phạm vi init_date_compare(); thay vào đó nó sẽ mong đợi để tìm thấy nó bên trong phạm vi toàn cầu.

Bên cạnh đó, hoặc mảng phải được chuyển qua tham chiếu (ví dụ: &$array) thông qua tham số chức năng hoặc mảng phải được trả về từ nó.

đóng cửa sẽ làm cho này một toàn bộ rất nhiều đẹp hơn (PHP> = 5.3):

function init_date_compare($key, &$array) 
{ 
    usort($array, function(array $a, array $b) use ($key) { 
     $t1 = strtotime($a[$key]); $t2 = strtotime($b[$key]); 
     return $t2 - $t1; 
    }); 
} 

Một cách khác là sử dụng một đối tượng để đóng gói nhà nước:

class DateComparer 
{ 
    private $key; 

    public function __construct($key) 
    { 
     $this->key = $key; 
    } 

    public function compare(array $a, array $b) 
    { 
     $t1 = strtotime($a[$this->key]); $t2 = strtotime($b[$this->key]); 
     return $t2 - $t1; 
    } 
} 

function init_date_compare($key, &$array) 
{ 
    usort($array, array(new DateComparer($key), 'compare')); 
} 
+0

Tôi thấy toàn cầu vô dụng trong trường hợp này. Tôi chưa bao giờ thấy mã bạn đã sử dụng trong ví dụ đầu tiên của mình trước đây, nhưng bây giờ tôi sẽ thử nghiệm nó. –

+0

Cảm ơn bạn đã làm việc! –

1

Tất nhiên rằng Jacks câu trả lời là điều cần làm, nhưng chỉ trong trường hợp bạn tự hỏi tại sao nó không hoạt động ở vị trí đầu tiên:
tuyên bố $key2 là biến toàn cầu chỉ là một vấn đề, vấn đề khác là hàm init_date_compare không trả về sor ted mảng.
Đoạn mã dưới đây sẽ làm việc:

$key2=0; 

function init_date_compare($key, $array) { 
    global $key2; 
    $key2 = $key; 
    function date_compare($a, $b) { 
     //global $key2; 
     $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]); 
     return $t2 - $t1; 
    } 
    usort($array, "date_compare"); 
    return $array; 
} 
$arr = array(array("Aug-2-2012"), array("June-2-2012")); 
$arr = init_date_compare(0, $arr); 
print_r($arr); 
+0

Cảm ơn, tôi chưa bao giờ nghĩ về điều đó. –

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