欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

ARRAY_MAP函数用法

shiping1 的头像

ARRAY_MAP函数用法

看php JSON 类中有这样一种用法array_map(array($this,'name_value'),$arr1,$arr2);  官网上竟然没找到,还好有牛人。摘抄记录下:

在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(12345);
$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(12345);
$b array_map("myclass::myMethoed"$a);
print_r($b);
?> 


Instead, you need to do this:
(你应该做如下调用)



$a = array(12345);
$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($argENT_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($argENT_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($argENT_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
        )

)
 
来自 http://www.tmser.com/post-71.html
普通分类: