zoukankan      html  css  js  c++  java
  • 数组函数的花式表演(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);             // 将数组的顺序打乱
  • 相关阅读:
    (原创)常用加密解密
    Winforms和资源(Resources/resx)
    delphi中的第三方控件如何安装 (转)
    IT博客
    访问FTP (转)
    设置radasm,使其支持8086 16位asm(转)
    EditPlus注册码(转)
    windows资源管理器已停止工作 (转)
    当发生异常时,怎样能不让‘delphi的异常提示框出现’而出现自己的‘异常提示框’?
    清除复制网页带过来的背景颜色 (转)
  • 原文地址:https://www.cnblogs.com/guixiaoming/p/5408014.html
Copyright © 2011-2022 走看看