数组函数的花式表演(1)

  学习之中,越来越感受到数组的重要性,今天就来总结下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);             // 将数组的顺序打乱
原文地址:https://www.cnblogs.com/guixiaoming/p/5408014.html