<?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>';
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号