2013-08-12 31 views
7

Tôi quen thuộc với việc tạo ra một hàm PHP được đặt ở phía trên cùng của file .php như:'Chức năng' và 'sử dụng' và 'mảng_filter' hoạt động như thế nào trong PHP?

function my_little_function($parm1,$parm2) { 
    if ($parms < $parm2) { 
    return "yes"; 
    } else { 
    return "no"; 
    } 
} 

Sau đó gọi nó là như thế này:

$result = my_little_function("1","2"); 
echo "The answer is $result." . "\n"; 

Tôi có một số mã, tôi didn' t viết nó, trong đó sử dụng "chức năng" và "sử dụng" với nhau bên trong của một sử dụng truyền thống của một chức năng như my_little_function ở trên.

Tôi đang bối rối bởi điều này và có một số câu hỏi dành cho bạn nhiều nhà phát triển PHP có kinh nghiệm hơn. Đây là một phần của mã PHP làm việc tôi đề cập đến:

$neededObject = array_filter($st_ny_trip->STOPS->STOP,function($e) use ($final_desired_dest,$connect_raw){return $e->NAME == $final_desired_dest && DateTime::createFromFormat("m/d/Y g:i:s a", $e->TIME) > $connect_raw;}); 

$e không được đặt trong bất kỳ phần nào của hàm hoặc phần còn lại của chương trình, vì vậy những gì đang sử dụng $e? Làm thế nào để nó vượt qua một giá trị và nó được sử dụng như thế nào? Có vẻ như không có tên cho chức năng này, vì vậy tôi không biết làm thế nào nó được gọi, làm thế nào là được thực hiện?

Điều này có tạo ra một hàm, đang được sử dụng và nó sẽ được tạo lại mỗi khi mã này được gọi? Nếu đó là một chức năng, tại sao không tạo ra nó bên ngoài chức năng này và gọi nó?

Tôi cũng chưa sử dụng 'sử dụng' bản thân mình, vì vậy điều đó không quen thuộc đối với tôi. Tôi nhìn nó trên php.net và nó trông giống như một cách để gán một giá trị cho một cái gì đó, nhưng tôi không thể tìm thấy bất kỳ ví dụ thực tế để chứng minh tại sao nó cần thiết và khi nó nên được sử dụng.

Tôi đã tra cứu array_filter và có nội dung là "Lọc các phần tử của mảng bằng chức năng gọi lại". Tôi không biết chức năng gọi lại là gì. Có phải nó đang đề cập đến function($e)?

Nếu dòng mã PHP ở trên cho $neededObject được định dạng khác nhau sao cho dễ đọc hơn?

+1

http: //php.net/manual/en/functions.anonymous.php – NDM

+0

PHP thật tuyệt vời, nó có một lý do khác Thứ tự nt cho 'array_map()' và 'array_filter()'. PHP sẽ cho bạn biết nếu bạn đang làm sai, nhưng vẫn còn. Kỳ dị. – Rudie

Trả lời

6

Hãy sử dụng array_map() để giải thích những gì đang diễn ra.

Chúng tôi muốn sao chép đầu vào của một mảng: vì vậy nếu đầu vào là aa, đầu ra sẽ là aaaa.

Vì vậy, theo cách thông thường, sẽ tạo ra một chức năng và sau đó vượt qua nó để array_map():

$array = range('a', 'e'); 

$new_array = array_map('duplicate', $array); 
print_r($new_array); 

function duplicate($string){ 
    return $string.$string; 
} 

Online demo

Nhưng nếu bạn muốn sử dụng chức năng này chỉ một lần? Kể từ PHP 5.3, có cái gì đó gọi là anonymous functions, chúng ta sử dụng nó như sau:

$array = range('a', 'e'); 

$new_array = array_map(function($string){ 
    return $string.$string; 
}, $array); 
print_r($new_array); 

Online demo

Bây giờ, chúng ta hãy nói ví dụ bạn muốn thêm một giá trị tiêu chuẩn từ một biến khác. Thật dễ dàng với các biến toàn cục. Nhưng như chúng ta đã biết, các biến toàn cục là điều ác và nên tránh. Chúng tôi có thể sử dụng use():

$array = range('a', 'e'); 
$standard_value = ','; 

$new_array = array_map(function($string)use($standard_value){ 
     // $standard_value becomes available inside the function 
    return $string.$standard_value.$string; 
}, $array); 
print_r($new_array); 

Online demo

use() có thể trở thành cũng rất hữu ích nếu chúng ta sử dụng một tài liệu tham khảo để viết thư cho một biến bên ngoài trong khi vòng lặp:

$array = range('a', 'e'); 
$another_string = ''; 

$new_array = array_map(function($string)use(&$another_string){// note & 
    $another_string .= $string.$string; // overwrite $another_string 
    return $string.$string; 
}, $array); 
print_r($new_array); 
echo PHP_EOL . $another_string; 

Online demo

2

$e hoạt động biến làm thông số chức năng bình thường và do đó sẽ được chuyển bởi mã gọi hàm, xem tài liệu về giá trị $e khi sử dụng array_filter.

Báo cáo use nhập các biến từ phạm vi địa phương vào phạm vi của anonymous' function.

$myvar = 'world'; 
$myFunc = function ($test) use ($myvar) { 
    return $test . ' ' . $myvar; 
}; 
echo $myFunc('hello'); // echoes 'hello world'; 

Nếu bạn không bao gồm phần use ($myvar), sau đó isset($myvar) sẽ trả về false từ bên các chức năng ẩn danh, vì nó có một phạm vi riêng biệt.