注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

简单的说说PHP array_walk与array_map 函数不同  

2012-05-11 14:29:00|  分类: Web技术-Php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

简单的说说PHP array_walk与array_map 函数不同
函数:       bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )
                   array array_map ( callback $callback , array $arr1 [, array $... ] )


相同点:都是将回调函数作用到给定数组的单元上


不同点:
/**
 * 1)参数:
 *           a 给定的数组:
 *          array_walk只接收一个指定的数组
 *  
 *          array_map 可接收多个指定的数组
 *  
 *        b callback 回调函数
 *          array_walk callback $funcname接受三个参数:
 *          第一个为array参数的值(项)
 *          第二个为    array参数的键名
 *          第三个为可选参数userdata
 *          需要注意的是:如果 funcname 函数需要的参数比给出的多,则每次 array_walk()调用 funcname 时
 *          都会产生一个 E_WARNING 级的错误
 *          另外如果需要直接改变数组中的值,可以将funcname的第一个参数设为引用
 *          
 *          array_map callback 接受的参数数目要与传入 array_map 函数的数组数目一致。
 *          另外:通常使用了两个或更多数组时,它们的长度应该相同,因为回调函数是平行作用于相应的单元上的。
 *                   如果数组的长度不同,则最短的一个将被用空的单元扩充。
 *         
 * 2)返回值: array_walk成功时返回 TRUE, 或者在失败时返回 FALSE.
 *
 *                   array_map  返回一个作用后的数组
 */

接下来我们通过相关实例来详细说明(注意以下例子都是分别进行测试的,不是同时进行的。)。


准备

首先我们定义两个数组
$array1 = array('xss1'=>'<script>alert("ss1")</script>','test1'=>'test1','trim2'=>'  trim1');
$array2 = array('xss2'=>'<script>alert("ss2")</script>','test2'=>'test2','trim2'=>'  trim2');

我们再定两个方法

此方法用于array_walk
function my_strip_ref(&$item,$key)
{
    $item = strip_tags($item);
}

此方法用于array_map
function my_strip_2($item1,$item2)
{
    return array(strip_tags($item1)=>strip_tags($item2));
}

开始进行测试

实例一使用 strip_tags()函数去HTML 和 PHP 标记
array_walk($array1,'strip_tags');
var_dump($array1);
/***
 * 输出:
 * array
  'xss1' => string '<script>alert("ss1")</script>' (length=29)
  'test1' => string 'test1' (length=5)
  'trim2' => string '  trim1' (length=7)
     并没有得到我们想要的,这里strip_tags函数是起了作用的,只是处理过后的结果
    没有正确返回,这里没有显示的赋值(或引用)传出相关值。
 */

$test = array_map('strip_tags',$array1);
var_dump($test);
/**
 * 输出:
 * array
  'xss1' => string 'alert("ss1")' (length=12)
  'test1' => string 'test1' (length=5)
  'trim2' => string '  trim1' (length=7)
      达到了预期的效果
 */

实例二使用 trim()函数去除空字符
array_walk($array1,'trim');
var_dump($array1);
/***
 * 输出:结果与strip_tags()一样
 *
 */

$test = array_map('trim',$array1);
var_dump($test);
/**
 * 输出:
 * array
  'xss1' => string '<script>alert("ss1")</script>' (length=29)
  'test1' => string 'test1' (length=5)
  'trim2' => string 'trim1' (length=5)
  达到预期结果
 */

实例三使用 strtoupper()函数全部大写字母
array_walk($array1,'strtoupper');
var_dump($array1);
/***
 * 输出:
 * Warning: strtoupper() expects exactly 1 parameter, 2 given in xxxxxx
 * 这里为何报错了呢??原因与array_walk()函数的callback函数的参数有关,
 * 我们上面提到了array_walk callback 函数有三个参数(第三个为可选),而strtoupper只接受一个
 * 参数,即 callback函数需要的参数比给出的多了。
 */

$test = array_map('strtoupper',$array1);
var_dump($test);
/**
 * 输出:
 * array
  'xss1' => string '<SCRIPT>ALERT("SS1")</SCRIPT>' (length=29)
  'test1' => string 'TEST1' (length=5)
  'trim2' => string '  TRIM1' (length=7)
  达到预期结果
 *
 */

实例四使用 自定义callback函数(引用),去掉HTML标记
array_walk($array1,'my_strip_ref');
var_dump($array1);
/***
 * 输出:
 *
 * array
  'xss1' => string 'alert("ss1")' (length=12)
  'test1' => string 'test1' (length=5)
  'trim2' => string '  trim1' (length=7)
 */

$test = array_map('my_strip_2',$array1,$array2);
var_dump($test);
/**
 * 输出:
 * array
  0 =>
    array
      'alert("ss1")' => string 'alert("ss2")' (length=12)
  1 =>
    array
      'test1' => string 'test2' (length=5)
  2 =>
    array
      '  trim1' => string '  trim2' (length=7)
   这样我们很容易构造一个数组的数组
 *
 */


相关:相关函数还有array_filter — 用回调函数过滤数组中的单元 等,更多信息参考官网手册。

类中的使用方法

在类中如何调用某个类的某个方法呢???以下以array_walk为例。

方式:array_walk(array,array(obj,'function name'))。

在类中如像:

    public function walk($array = array())
    {
        array_walk ( $array, "$this->prin" );
    }

这样使用是错误的,正确的使用是:

    public function walk($array = array())
    {
        array_walk ( $array, array ($this, 'prin' ) ); //这样写才是正确的
    }

例:

class walk_array
{
    
    public function prin($item, $key)
    {
        echo '键名为:' . $key . ' == 数组值为' . $item . '<br/>';
    }
    public function walk($array = array())
    {
        array_walk ( $array, array ($this, 'prin' ) ); //注意此处,应采用此种方法
    }
}
$array = array ("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple" );
$walk = new walk_array ();
$walk->walk ( $array );


类似的还有像session的操作函数:
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
session_start();
那么要调用某个类的某个方法时: 如下写:
session_set_save_handler(array(&obj,"open"), array(&obj,close"),array(&obj,read"), array(&obj,write"), array(&obj,destroy"), array(&obj,gc"));
注:obj 指的是某个类的实例化的对象。(不是对象名称,而在一个对象)

其它函数类比。

另见官网BUG中心:http://bugs.php.net/9552


附上两个排序方法

<?php
/**
* 冒泡排序
*
*/
function maoPaoSort($array)
{
$n = count ( $array );
if ($n <= 1)
{
return $array;
}
//下标是从0开始的
$n -= 1;
//趟数
for($i = 0; $i < $n; $i ++)
{
//两俩数比较
for($j = 0; $j < $n - $i; $j ++)
{
if ($array [$j] > $array [$j + 1])
{
$tpl = $array [$j];
$array [$j] = $array [$j + 1];
$array [$j + 1] = $tpl;
}
}
}
return $array;
}

$array = array (8, 3, 10, 1, 2, 7, 9, 4, 5, 6 );
$array =maoPaoSort ( $array );
var_dump ( $array );


/**
*
* 快速排序
*/
function quickSort($array)
{
$n = count ( $array );
if ($n <= 1)
{
return $array;
}
$key = $array [0];
$high = array ();
$low = array ();
for($i = 1; $i < $n; $i ++)
{
if ($array [$i] > $key)
{
$high [] = $array [$i];
} else
{
$low [] = $array [$i];
}
}
$low = quickSort ( $low );
$high = quickSort ( $high );
$array = array_merge ( $low, array ($key ), $high );
return $array;
}

$array = array (8, 3, 10, 1, 2, 7, 9, 4, 5, 6 );
$array = quickSort ( $array );
var_dump ( $array );







  评论这张
 
阅读(1129)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017