在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
)