您的位置:首页 > 编程语言 > PHP开发

PHP array_map() 处理数组的单元数据问题

2012-11-08 15:26 726 查看
今天在使用array_map 时候遇到需要调用 类的静态方法,没想到参数该如何传递,大家的智慧是无穷的,幸而找到如下一片博文,mark下;原文见:
http://blog.zol.com.cn/3917/article_3916396.html
在PHP编程中,我们经常会遇到处理数组的单元数据问题,比如对数组中每个单元应用自定义函数。

一种方法是通过循环遍历整个数组,对每个单元调用自定义函数,然后用返回值替换原数组相应单元的值。这也是最常见和简单的方法,在此就不举例了。

一种方法是通过PHP提供的array_map函数回调自定义函数,这也是被推荐的方法。

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:由于文章长度限制,我只好去掉注释。。。):

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

$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' => 'abc@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));
?>


这里有几点可以参考的:

1,在PHP类中通过array_map函数回调内部方法时,类名称可以使用__CLASS__常量。我们强烈推荐使用此常量,因为不论你类如何修改,这能保证最终结果都是正确的。

2,如果回调的方法是非静态类型,亦可通过$this伪变量指定。

3,在PHP类中的array_map函数总是不能识别self伪变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: