学习之中,越来越感受到数组的重要性,今天就来总结下PHP中强大且常用的数组函数。
1.二维数组的以 元素某一个键值 为排序依据 进行排序:
<?php $array[] = array('id'=>1,'price'=>50); $array[] = array('id'=>2,'price'=>70); $array[] = array('id'=>3,'price'=>30); $array[] = array('id'=>4,'price'=>20); usort($array,function($a,$b){ return $a['leadtime'] > $b['leadtime']; }); var_dump($array); //结果 Array ( [0] => Array ( [id] => 4 [price] => 20 ) [1] => Array ( [id] => 3 [price] => 30 ) [2] => Array ( [id] => 1 [price] => 50 ) [3] => Array ( [id] => 2 [price] => 70 ) )
第二种方法 写的一个封装函数,更加灵活
function SortArray($array,$column,$type = 'ASC'){ $arr = []; //将排序的元素键值作为数组的键名 foreach($array as $ak => $av){ // 将 排序依据的 那个元素数组里面的 键值 作为 新的数组键名,并且 $arr[$av[$column]] = $av; } //按照键名 对数组排名就行了 if($type == 'ASC'){ ksort($arr); }elseif($type == 'DESC'){ krsort($arr); }else{ //todo } return array_value($arr); }
$SortArray = SortArray($array);
print_r($SortArray);
第三种方法,对多个数组或者多维数组排序, array_multisort(),可以多个排序依据 ,
<?php $data[] = array('volume' => 67, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 1); $data[] = array('volume' => 85, 'edition' => 6); $data[] = array('volume' => 98, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 6); $data[] = array('volume' => 67, 'edition' => 7); foreach ($data as $key => $row) { $volume[$key] = $row['volume']; $edition[$key] = $row['edition']; } // 将数据根据 volume 降序排列,根据 edition 升序排列 // 把 $data 作为最后一个参数,以通用键排序 array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); //还可以多个数组一起的 array_multisort(array1,sorting order,sorting type,array2,array3...)
var_dump($data);
/* array(6) { [0]=> array(2) { ["volume"]=> int(98) ["edition"]=> int(2) } [1]=> array(2) { ["volume"]=> int(86) ["edition"]=> int(1) } [2]=> array(2) { ["volume"]=> int(86) ["edition"]=> int(6) } [3]=> array(2) { ["volume"]=> int(85) ["edition"]=> int(6) } [4]=> array(2) { ["volume"]=> int(67) ["edition"]=> int(2) } [5]=> array(2) { ["volume"]=> int(67) ["edition"]=> int(7) } } */
以上是工作时,用到过的一些小例子。q其中包含了【array_column(),array_value(), ksort(),array_multisort()】
2.list(),array_merge(),in_array(),array_filter()
list() 是在接收数组参数时,可以很方便将参数元素取出来赋予变量;用法很简单,用起来很方便,可参考http://www.w3school.com.cn/php/func_array_list.asp
array_merge 合并数组:例如
for循环的时候,源源不断产生新的数组,而这些数据又是平级的,这个时候就可以这样
foreach ($articleInfo as $ak => $av) { $keyArticle['i'] = $ak; $keyArticle['weChatId'] = $av->wechatId; $keyArticle['wechatName'] = $av->wechatName; $keyArticle['title'] = $av->title; $keyArticle['url'] = $av->url; $keyArticle['likeNum'] = $av->likeNum; $keyArticle['readNum'] = $av->readNum; $keyArticle['realreadNum'] = $av->realReadNum; $keyArticle['comment'] = ''; $keyArticles = array_merge($keyArticles, [$keyArticle]); }
自身数组合并,实现了同级数据的抓取。
说到 in_array() ,平时查询什么具体元素在不在某个大范围内的时候用得比较多,比如 某一个id在不在关键词id中;比如某个文件在不在某一文件夹下的文件群中。
下面说一个平常经常用到的扫目录的例子。
$dir = '/var/samba/guimm/mount/www/wechat_analy/app/web/'.$user_id.'/'; foreach(scandir($dir) as $i => $mod) { if(is_dir($mod) && !in_array($mod,['.','..'])) { continue; }else{ $files[$i] = $mod; } }
注意使用了scandir()函数可以避免使用老式的目录扫描判断,大大简化代码并且质量较高,scandir()介绍http://www.w3school.com.cn/php/func_directory_scandir.asp
array_filter()
后端程序主要就是和数据打交道,所以时刻注意取不到数据的情况,防止程序出现不必要的bug,
array_filter()主要是过滤数组的值,常可用与过滤空值,还可以根据回调函数来过滤。
与此同时,可以关注empty()判断一维数组与多维数组的为空的情况0.0
3.数组的“增删改查” -----array_push(),array_pop(),array_shift(),array_unshift(),array_diff();
元素从底部加入数组 =》 array_push($arr,'apple','pear'),
将数组最后一个元素删除 =》 array_pop($arr);
将数组的第一行元素删除,数组长度减一,元素前移一位,数字键名改为从零计数,文字键名不变 =》 array_shift($arr);
在数组的开始插入若干元素 =》 array_unshift($arr,'1','a',array('1','3'));
array_key_exists("apple", $arr); // 检索给定的键名是否存在数组中
array_reverse($arr); //将数组中的元素翻转
array_count_values($arr); // 统计数组中所有值出现的次数
二、数组的分段和填充
1 array_slice($arr, 0, 3); //将数组中的一段取出,此函数忽略键名(数组的分段) 2 array_splice($arr, 0, 3,array("black","maroon")); //将数组中的一段取出,返回的序列从原数组中删除 3 array_chunk($arr, 3, TRUE); //将一个数组分割成多个,TRUE为保留原数组的键名(分割多个数组)
最近用到array_diff(),感觉比较方便。导入excel中的数据,找到数据中不存的wechatId的
array_diff(); // 返回数组差值,一般一般数组还用,不能直接用于二维数组
还有下列相似的数组,嘿嘿
array_diff_assoc($arr1, $arr2, $arr3); //返回差集结果数组,键名也做比较 array_intersect($arr1, $arr2); //返回交集结果数组
array_intersect_assoc($arr1, $arr2); //返回交集结果数组,键名也做比较
两个随机性的数组函数
1 array_unique($arr); //移除数组中重复的值,新的数组中会保留原始的键名 2 shuffle($arr); // 将数组的顺序打乱