<?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>';