博客列表 >php之数组回调函数练习

php之数组回调函数练习

Serendipity-Ling
Serendipity-Ling原创
2018年01月09日 17:10:281001浏览
<?php
/**
 * 1.array_filter($arr,function($value){}):将每个值传入回调,最终结果仅包括返回true的元素,返回数组
 * ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数
 *ARRAY_FILTER_USE_BOTH - callback同时接受键名和键值
 * 注意:如果不加callback,array_filter会默认过滤掉值为false的键值对(键名也不能为空)
 */
header('content-type:text/html;charset=utf-8');
//array_filter()可以过滤出数组中的$value,你可以对你过滤出来的$value进行删除,更新操作
//创建一个新数组,以这个数组做演示
$Array1 = ['id'=>20,'name'=>'黄蓉','course'=>'php','grade'=>99,'level'=>'优等',''=>''];
print_r($Array1);
echo '<br>这是初始的数组<hr>';
/*
 * 演示计划:
 * 将黄蓉改为郭靖,分数改为66
 * 删除level
 * 去除空元素
 */
$arrayToFilter = array_filter($Array1,function (&$value){
  if ($value == '黄蓉')
  {
      $value = '郭靖';
      return true;
  }else if ($value == 99)
  {
      $value = 66;
      return true;
  }else if ($value == '优等')
  {
      return false; //返回false,这个值就不会出现在结果中
  }else if ($value == '')
  {
      return false;
  }else
  {
      return true;//其他值就直接返回true,原样输出
  }
},ARRAY_FILTER_USE_BOTH);//默认输出键值和键名
print_r($arrayToFilter);
echo '<br>这是经过array_filter处理的数组<hr>';

//注意:如果不加callback,array_filter会默认过滤掉值为false的键值对(键名也不能为空)
$entry = array(
    0 => 'foo',
    1 => false,
    2 => -1,
    3 => null,
    4 => '',
);
echo '<br>';
print_r(array_filter($entry));
echo '<br>';
//结合位运算知识,来分出奇偶数
function odd($var) {
    //作用,按位与,如果二进制最后一位是1肯定是奇数
    return ($var & 1);
};
function even($var){
    return (! ($var & 1));
}
$num = [1,2,3,4,5,6,7,8,9];
$num2 = [1,2,3,4,5,6,7,8,9];
echo '<br>';
echo "odd函数回调:\n";
print_r(array_filter($num,"odd")) ;
echo '<br>';
echo "even函数回调:\n";
print_r(array_filter($num2,"even")) ;


/*
 * 2.array_walk($arr, function($value,$key[,$p]){},$p):将每个键值传入回调,返回布尔值
 * 优点:array_walk() 不会受到 array 内部数组指针的影响。array_walk() 会遍历整个数组而不管指针的位置。
 * 演示计划:
 * 遍历出$Array1里的键值对,并过滤掉空元素,键名后加**
 */
echo '<table align="center" border="1" cellspacing="0" >';
$arrayToWalk = array_walk($Array1,function ($value,$key,$suffix){
    if ($key!= '')
    {
        echo '<tr>';
        echo '<th>'.$key.$suffix.'</th>';
        echo '</tr>';
        echo '<tr align="center">';
        echo '<td>'.$value.'</td>';
        echo '</tr>';
    }
},'**');
echo '</table>';
echo '这是将$Array放进array_walk遍历出来的数组';
/*
 * 从这里是不是看出什么不对了,记得$Array在前面已经用array_filter处理过了,删除了level和空元素
 * 更改了name和grade,之后我再把$Array放进array_walk遍历出来时,发现前面删除的元素也出来了,这里我可以理解为
 * array_filter也许是把处理的结果传到新的结果集$arrayToFilter中,$Array本身没有变化。但是接下来我遍历出的元素
 * 却发现$Array的键名name和grade的值是输出了经过array_filter处理过的值,这是为什么?
 * 推测:在array_filter处理时,对name和grade赋了值,也就是传递的值已经变化了,而删除level和空元素并不是赋值操作,只是不
 * 返回出来而已,在$Array中是真实存在的
 */

/*
 * 3. array_map(function(),$arr1[,arr2...]):对1个或多个数组回调处理,返回索引数组记录执行结果
 *
 */
//判断奇偶性
$num3 = [1,2,3,4,5,6,7,8,9];
$numToOdd = array_map(function ($var){
    if ($var & 1)
    {
        return '奇数';
    }else
    {
        return false;
    }
},$num3);
echo '<hr>';
echo '<pre>';
print_r($numToOdd);
//计算出奇数的个数
//先把空值去掉
$numToOdd2 = array_filter($numToOdd);
//如果你有强迫症的话,可以使用array_values()重新排列序列号
//第一种方法:计算数组的长度
$oddNumber = count($numToOdd2);
echo $oddNumber;
//第二种方法计算数组的长度
echo sizeof($numToOdd2);


//array_map(null,$arr1,$arr2...),可以生成多维数组
$array1 = ['id','name','course','grade'];
$array2 = [1,'杨过','php',88];
$student = array_map(null,$array1,$array2);
echo '<hr>';
echo '<pre>';
print_r($student);
//接下来采用list()来处理
echo '<table align="center" border="1" cellspacing="0" >';
foreach ($student as $value)
{
    list($key,$val)=$value;

    echo '<tr>';
    echo '<th>'.$key.'</th>';
    echo '</tr>';
    echo '<tr align="center">';
    echo '<td>'.$val.'</td>';
    echo '</tr>';
};
echo '</table>';


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议