在php中,函數create_function主要用來創建匿名函數,有時候匿名函數可以發揮它的作用。
1.測試一
測試一主要用來循環替換數組中多個值的<與>,我們用array_map加上create_function解決這個問題。
###############################################
function filterChars($a) {
if (!is_array($a)) return false;
$a = array_map(create_function(‘$b’, ‘return str_replace(array(“>”, “<”), array(“>”, “<”), $b);’), $a);
return $a;
}
$a = array(‘abcd&>’, ‘def<’);
echo “array_map and create_function\n”;
print_r(filterChars($a));
###############################################
2.測試二
測試二與測試一實現同樣的功能,只不過我們用的不是匿名函數,而是用自定義函數實現的,而且這個自定義函數實現在另外一個函數里面。
###############################################
function filterChars2($a) {
if (!is_array($a)) return false;
function filterStr($str) {
return str_replace(array(“>”, “<”), array(“>”, “<”), $str);
}
$a = array_map(‘filterStr’, $a);
return $a;
}
$a = array(‘abcd&>’, ‘def<’);
echo “array_map and create_function and custom function\n”;
print_r(filterChars2($a));
//如果調用了filterchar2函數,則在下面調用filterStr時不報錯,如果在上面沒有調用filterChar2函數,則會報類似如下的錯誤,Fatal error: Call to undefined function filterStr() in D:\myphp\research\test4.php on line 334
echo ‘filterStr:’ . filterStr(‘ab&<>cd’) . “\n”;
###############################################
3.測試三
測試三主要用來過濾文件中的空行,同時用trim去掉每一行的換行符然后保存在數組中。
###############################################
$file = ‘tmp_user.txt’;
if (file_exists($file)) {
$usernames = file($file);
print_r($usernames);
/*
array array_filter ( array input [, callback callback] )
array_filter() 依次將 input 數組中的每個值傳遞到 callback 函數。如果 callback 函數返回 TRUE,則 input 數組的當前值會被包含在返回的結果數組中。數組的鍵名保留不變。
切記,即使在array_filter中的create_function中用trim過濾了空白字符,但是仍然需要用array_map處理每一行中的內容,因為array_filter的作用是,只要回調函數返回true,則數組中當前的值被返回,返回的是用trim處理之前的值,也就是原始的值。
*/
$usernames = array_filter($usernames, create_function(‘$id’, ‘$id = trim($id); return !empty($id);’));
//由於文件通過file加載到數組中,因此一定要用trim處理一下去掉換行符
$usernames = array_map(create_function(‘$id’, ‘$id = trim($id); return $id;’), $usernames);
print_r($usernames);
}
###############################################
輸出如下:
測試一
array_map and create_function
Array
(
[0] => abcd&>
[1] => def<
)
測試二
array_map and create_function and custom function
Array
(
[0] => abcd&>
[1] => def<
)
filterStr:ab&<>cd
測試三
Array
(
[0] => ab
[1] => cd
[2] =>
[3] => ef
[4] => gh
)
Array
(
[0] => ab
[1] => cd
[3] => ef
[4] => gh
)