array_map函数用法
看php JSON 类中有这样一种用法array_map(array($this,'name_value'),$arr1,$arr2); 官网上竟然没找到,还好有牛人。摘抄记录下:
在PHP编程中,我们经常会遇到处理数组的单元数据问题,比如对数组中每个单元应用自定义函数。
一种方法是通过循环遍历整个数组,对每个单元调用自定义函数,然后用返回值替换原数组相应单元的值。这也是最常见和简单的方法,在此就不举例了。
一种方法是通过PHP提供的array_map函数回调自定义函数,这也是被推荐的方法。
说明:
array array_map ( callback callback, array arr1 [, array ...] )
array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
摘录一段PHP手册的列子简要说明如下:
function cube($n){
return $n * $n * $n;
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
?>
那么,如果你是在一个PHP类中通过array_map函数回调内部方法又该如何做呢?
同样,我们可以在PHP手册中找到一段用户添加的说明:
If
you need to call a static method from array_map, this will NOT work:
(如果你想在array_map函数中回调一个静态方法,那么下面的做法是错误的)
$a = array(1, 2, 3, 4, 5);
$b =
array_map("myclass::myMethoed", $a);
print_r($b);
?>
Instead,
you need to do this:
(你应该做如下调用)
$a = array(1, 2, 3, 4, 5);
$b =
array_map(
array
(
"myclass","myMethoed"
)
, $a);
print_r($b);
?>
感谢作者的分享,因为PHP手册中对array_map函数的参数说明确实太过简单,以至于连基本的对象方法引用都没提及。
现在进入我们讨论的主题:如果在PHP类中通过array_map函数回调内部方法要如何做呢?
先看一下代码(PS:由于文章长度限制,我只好去掉注释。。。):
/**
+-------------------------------------------------------------------------------------------
*
@project SimpleObject
*
@package SimpleObject
*
@author Mc@Spring
*
@version $ID: array.php Created on 2008-9-28 by Mc@Spring at 11:04:57
$
*
@todo TODO
*
@update Modified on 2008-9-28 by Mc@Spring at 11:04:57
*
@link http://groups.google.com/group/mspring
*
@copyright Copyright (C) 2007-2008 Mc@Spring. All rights
reserved.
*
*
Licensed under The Apache License
*
@license http://www.apache.org/licenses/LICENSE-2.0 Apache
License
+-------------------------------------------------------------------------------------------
*/
//
(true === SO_SYS_ACCESS) || exit ('System access denied!');
class Test{
public
function __construct(){}
public
function common_filter($arg){
return $this->entities($arg);
}
public
function public_static_filter($arg){
return self::_entities($arg);
}
public
function private_static_filter($arg){
return self::__entities($arg);
}
public
function entities($arg){
$return = null;
if(is_array($arg)){
$return = array_map(array($this, 'entities'), $arg);
}else{
$return = is_numeric($arg)
? $arg : htmlspecialchars($arg, ENT_QUOTES);
}
return $return;
}
public
static function _entities($arg){
$return = null;
if(is_array($arg)){
//
this will neithor work under static call nor class instantiate
//$return
= array_map(array(self, '_entities'), $arg);
//
this will work under both static call and class instantiate
$return = array_map(array(__CLASS__, '_entities'), $arg);
}else{
$return = is_numeric($arg)
? $arg : htmlspecialchars($arg, ENT_QUOTES);
}
return $return;
}
private
static function __entities($arg){
$return = null;
if(is_array($arg)){
$return = array_map(array(__CLASS__, '__entities'), $arg);
}else{
$return = is_numeric($arg)
? $arg : htmlspecialchars($arg, ENT_QUOTES);
}
return $return;
}
}
$args =
array(
'name' => 'Mc\'Spring',
'age' => 25,
'email' => 'Fuck.Spam@gmail.com',
'address' => 'Simple
Test'
);
print_r(Test::_entities($args));
echo '
';
$obj =
new Test;
print_r($obj->entities($args));
echo '
';
print_r($obj->common_filter($args));
echo '
';
print_r($obj->public_static_filter($args));
echo '
';
print_r($obj->private_static_filter($args));
//
echo hightlight_file(__FILE__);
?>
这里有几点可以参考的:
1,在PHP类中通过array_map函数回调内部方法时,类名称可以使用__CLASS__常量。我们强烈推荐使用此常量,因为不论你类如何修改,这能保证最终结果都是正确的。
2,如果回调的方法是非静态类型,亦可通过$this伪变量指定。
3,在PHP类中的array_map函数总是不能识别self伪变量。
其他的用法:
<?php
$a = array(1, 2, 3, 4, 5);
$b = array("one", "two", "three", "four", "five");
$c = array("uno", "dos", "tres", "cuatro", "cinco");
$d = array_map(null, $a, $b, $c);
print_r($d);
?>
输出:
Array
(
[0] => Array
(
[0] => 1
[1] => one
[2] => uno
)
[1] => Array
(
[0] => 2
[1] => two
[2] => dos
)
[2] => Array
(
[0] => 3
[1] => three
[2] => tres
)
[3] => Array
(
[0] => 4
[1] => four
[2] => cuatro
)
[4] => Array
(
[0] => 5
[1] => five
[2] => cinco
)
)