• 数组的相关处理函数


    1、数组的键、值操作函数
    2、统计数组元素的个数与唯一性
    3、使用回调函数处理数组的函数
    4、数组的排序函数
    5、拆分、合并、分解与结合数组
    6、数组与数据结构
    7、其他有用的数组处理函数




    1、数组的键、值操作函数

    array_values();
    用途:返回数组中所有的值
    格式:array array_values ( array input )

    array_keys();
    用途:返回数组中所有的键名
    格式:array array_keys(array input[,mixed search_value [,bool strict]])   其中search_value为空则只返回该值的键名

    in_array();
    用途:检查数组中是否存在某个值
    格式:bool in_array(mixed needle, array haystack [,bool strict]) 其中strict参数:是否匹配类型

    array_flip();
    用途:交换数组中的键和值
    格式:array array_flip(array trans)

    array_reverse()
    用途:返回一个单元顺序相反的数组
    格式:array array_reverse ( array array [, bool preserve_keys] )    如果 preserve_keys 为 TRUE 则保留原来的键名

    案例:
    $arr = ['rose','lily','xiaoxue','jack','xiaoming','jack'];

    /获取一个数组所有的键,以索引数组形式返回
    $result =array_keys($arr);
    print_r($result);

    //获取一个数组所有的值,以索引数组形式返回
    $result = array_values($arr);
    print_r($result);

    // in_array() 可以用于判断上传文件格式是否符合要求。$arr = ['jpg','png','gif'];
    // $result = in_array('jacky',$arr);
    // var_dump($result);

    if(in_array('jackok',$arr)){
        echo 'jack存在于$arr数组中';
    }else{
        echo 'jack不存在于$arr数组中';
    }

    // 翻转键值
    $brr = array_flip($arr);
    print_r($brr);

    // 翻转数组顺序
    $arr = ['rose','lily','xiaoxue','jack','xiaoming','ajack'];
    print_r(array_reverse($arr,true));

    2、统计数组元素的个数与唯一性

    count();
    用途:计算数组中的单元数目或对象中的属性个数

    案例:
    $arr = ['rose','lily','xiaoxue','jack','xiaoming','ajack'];
    //返回数组单元个数或者对象成员属性个数
    echo count($arr);


    array_count_values();
    用途:统计数组中所有的值出现的次数

    array_unique();
    用途:移除数组中重复的值

    案例:
    <?php
    $arr = ['a','b','a','c','d','c','a','b'];

    //统计数组单元值出现的次数
    $brr = array_count_values($arr);

    //移除数组中重复的值 
    $crr = array_unique($arr);
    print_r($crr);   

    结果:
    Array
    (
        [a] => 3
        [b] => 2
        [c] => 2
        [d] => 1
    )
    Array
    (
        [0] => a
        [1] => b
        [3] => c
        [5] => d
    )


    3、使用回调函数处理数组的函数
    array_filter();
    用途:用回调函数过滤数组中的单元
    格式:array array_filter(array input [,callback callback])
    解释:依次将input数组中的每个值传递callback函数
      • 如果callback函数返回TRUE,则input数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
      • 如果没有提供callback函数,array_filter()将删除input中所有等值为FALSE的条目。
    案例1:非空!empty
    <?php
    include 'db.php';
    $sql = "select * from bbs_content limit 1";
    $data = select($sql)[0];
    echo '<pre>';

    //用回调函数过滤数组中的单元
    $result = array_filter($data,'myfunc');

    function myfunc($x)
    {
        return !empty($x);
    }

    print_r($result);

    结果:
    Array
    (
        [id] => 1
        [pid] => 4
        [uid] => 1
        [title] => 阿斯顿发送到
        [content] =>

        [edittime] => 1398212373
        [posttime] => 1398212373
        [visittimes] => 1
        [cost] => 10
        [ip] => 2130706433
        [isopen] => 1
    )

    案例2(上边结果的反例):空empty
    //用回调函数过滤数组中的单元
    $result = array_filter($data,'myfunc');

    function myfunc($x)
    {
        return empty($x);
    }

    print_r($result);
    结果:
    Array
    (
        [pic] =>
        [keywords] =>
        [description] =>
        [ishot] => 0
        [isjinghua] => 0
        [istop] => 0
        [allowlevel] => 0
        [needreply] => 0
        [inbox] => 0
    )

    案例3:
    $arr = [0,1,2,3,true,false,null];

    $result = array_filter($arr,'fun');

    function fun($a)
    {
        if($a){
            return true;
        }else{
            return false;
        }
    }

    print_r($result);

    案例三的简化:

    $result = array_filter($arr,function($x){ return $x;});
    print_r($result);

    结果都为:
    Array
    (
        [1] => 1
        [2] => 2
        [3] => 3
        [4] => 1
    )

    array_walk();
    用途:对数组中的每个成员应用用户函数
    格式:bool array_walk(array &array, callback funcname[,mixed userdata])
    解释:如果成功则返回 TRUE,失败则返回 FALSE。
               将用户自定义函数 funcname 应用到 array 数组中的每个单元。典型情况下 funcname 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 userdata,将被作为第三个参数传递给 callback funcname。 
               array_walk() 不会受到 array 内部数组指针的影响。array_walk() 会遍历整个数组而不管指针的位置。 

    案例:
    <?php
    $arr = ['apple','li','banana','xigua','taozi'];
    echo '<pre>';

    //对数组中的每个成员应用用户函数
    array_walk($arr,"myfun");

    function myfun(&$v,$k)
    {
        $v .= 'lai 2 jin';
    }

    print_r($arr);

    array_walk($arr,'fun','abc');

    function fun(&$v,$k,$u)
    {
        $v.=$u;
    }
    print_r($arr);

    结果:

    Array
    (
        [0] => applelai 2 jin
        [1] => lilai 2 jin
        [2] => bananalai 2 jin
        [3] => xigualai 2 jin
        [4] => taozilai 2 jin
    )
    Array
    (
        [0] => applelai 2 jinabc
        [1] => lilai 2 jinabc
        [2] => bananalai 2 jinabc
        [3] => xigualai 2 jinabc
        [4] => taozilai 2 jinabc
    )

    疑问:array 参数的值作为第一个,键名作为第二个。为什么输出键名为索引下标?
    后来自己给的答案:更改的是数组单元的值,又没有更改键名,还是按正常原则输出的呀,只是在原有的基础上,增加了相应的值罢了。

    array_map(); 
    用途:将回调函数作用到给定数组的单元上
    格式:array array_map ( callback callback, array arr1 [, array ...] )
    解释:array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致

    案例:

    <?php
    $arr = [10,100,20,60,50,60];
    $brr = [11,21,31,41,51,61,71];

    //将回调函数作用到给定数组的单元上 
    $result = array_map('myfun',$arr);

    function myfun($x)
    {
        return $x += 10;
    }

    echo '<pre>';
    print_r($result);

    $result  = array_map('fun',$arr,$brr);
    function fun($x,$y)
    {
        return $x + $y;
    }
    print_r($result);
     
    结果:
    Array
    (
        [0] => 20
        [1] => 110
        [2] => 30
        [3] => 70
        [4] => 60
        [5] => 70
    )
    Array
    (
        [0] => 21
        [1] => 121
        [2] => 51
        [3] => 101
        [4] => 101
        [5] => 121
        [6] => 71
    )

    4、数组的排序函数

    sort -- 对数组排序(升序)
    rsort -- 对数组逆向排序(降序)
    usort --  使用用户自定义的比较函数对数组中的值进行排序

    案例:
    <?php
    $arr = [10,100,20,60,50,60];
    echo '<pre>';
    /*
    //对数组排序(升序)
    sort($arr);
    //对数组排序(降序)
    rsort($arr);

    print_r($arr);
    */


    usort($arr,'myfun');

    function myfun($a,$b)
    {
       retrun $a-$b;
    }
    print_r($arr);

    结果:
    Array
    (
        [0] => 10
        [1] => 20
        [2] => 50
        [3] => 60
        [4] => 60
        [5] => 100
    )

    根据元素的值对数组排序(保留原有键名和值的关系)
    asort -- 对数组进行排序并保持索引关系(关联数组排序)
    arsort --  对数组进行逆向排序并保持索引关系 
    uasort --  用户自定义的比较函数对数组进行排序并保持索引关系

    案例:
    <?php
    header("content-type:text/html;charset=utf-8");
    $users = ['user1' => 'xiongda','user2' => 'xiaohei','user3'=>'xibobai'];
    echo '<pre>';
    //对数组进行升序排序并保持索引关系
    // asort($users);

    //对数组进行降序排序并保持索引关系
    // arsort($users);

    //使用用户自定义函数,对数组进行排序并保持索引关系
    uasort($users,'myfun');

    function myfun($a,$b)
    {
        if($a > $b){
            return 1;
        }
        if($a < $b){
            return -1;
        }
        if($a == $b){
            return 0;
        }
    }
    print_r($users);

    结果:按值排序:abo,索引关系不变
    Array
    (
        [user2] => xiaohei
        [user3] => xibobai
        [user1] => xiongda
    )

    根据键名对数组排序(保留原来的键)
    ksort -- 对数组按照键名排序
    krsort -- 对数组按照键名逆向排序
    uksort --  使用用户自定义的比较函数对数组中的键名进行排序

    案例:
    <?php
    header("content-type:text/html;charset=utf-8");
    $users = ['user6' => 'xiongda','user2' => 'xiaohei','user1'=>'xibobai'];

    // 对数组按照键名升序排序
    ksort($users);

    // 对数组按照键名降序排序
    krsort($users);

    //使用用户自定义的比较函数对数组中的键名进行排序 
    uksort($users,'myfun');

    function myfun($a,$b)
    {
        if($a > $b){
            return 1;
        }
        if($a < $b){
            return -1;
        }
        if($a == $b){
            return 0;
        }
    }
    echo '<pre>';

    print_r($users);

    结果:
    Array
    (
        [user1] => xibobai
        [user2] => xiaohei
        [user6] => xiongda
    )

    natsort --  用“自然排序”算法对数组排序
    natcasesort --  用“自然排序”算法对数组不区分大小写字母排序 
    array_multisort -- 对多个数组或多维数组进行排序

    案例:
    <?php
    $arr = ['image123','Image102','image120','Image1202','image1231'];

    echo '<pre>';
    sort($arr);

    print_r($arr);
    echo '<hr>';
    // 自然排序
    natsort($arr);
    print_r($arr);
    echo '<hr>';

    // 不区分大小写自然排序
    natcasesort($arr);
    print_r($arr);

    结果:
    Array
    (
        [0] => Image102
        [1] => Image1202
        [2] => image120
        [3] => image123
        [4] => image1231
    )按照ASCII码排序

    Array
    (
        [0] => Image102
        [1] => Image1202
        [2] => image120
        [3] => image123
        [4] => image1231
    )按照ASCII码排序

    Array
    (
        [0] => Image102
        [2] => image120
        [3] => image123
        [1] => Image1202
        [4] => image1231
    )不区分大小写自然排序

     
    sort 和natsort的比较:sort按位排序
    <?php
    //image全是小写i
    $arr = ['image123','image102','image120','image1202','image1231'];

    echo '<pre>';
    sort($arr);

    print_r($arr);
    echo '<hr>';
    // 自然排序
    natsort($arr);
    print_r($arr);

    结果:
    Array
    (
        [0] => image102
        [1] => image120
        [2] => image1202
        [3] => image123
        [4] => image1231
    )
    Array
    (
        [0] => image102
        [1] => image120
        [3] => image123
        [2] => image1202
        [4] => image1231
    )

     
    array_multisort -- 对多个数组或多维数组进行排序

    <?php
    include 'db.php';
    $sql = 'select regtime,username,money,email from bbs_user limit 3';
    $data = select($sql);

    echo '<pre>';
    // print_r($data);

    foreach($data as $v){
        $email[] = $v['email'];
        $username[] = $v['username'];
        $regtime[]=$v['regtime'];
    }

    // print_r($email);
    // print_r($username);

    //多维数组排序
    array_multisort($username,SORT_DESC,$regtime,SORT_ASC,$email,SORT_ASC,$data);
    print_r($data);

    结果:
    Array
    (
        [0] => Array
            (
                [regtime] => 1397632974
                [username] => jackyok
                [money] => 100
                [email] => jads@qq.com
            )
     
        [1] => Array
            (
                [regtime] => 1397632773
                [username] => jack
                [money] => 100
                [email] => 50377203@qq.com
            )
     
        [2] => Array
            (
                [regtime] => 1397633371
                [username] => alibaba
                [money] => 100
                [email] => 50377203@qq.com
            )
     
    )

     5、拆分、合并、分解与结合数组
    array_slice -- 从数组中取出一段 
    <?php
    $arr = ['a','b','c','d','e','f'];
    // $result = array_slice($arr,3);
    $result = array_slice($arr,-4,-1);

    var_dump($result);

    结果:
    array(3) { [0]=> string(1) "c" [1]=> string(1) "d" [2]=> string(1) "e" }

    array_splice --  把数组中的一部分去掉并用其它值取代 

    <?php
    $arr = ['a','b','c','d','e','f'];

    // $brr = array_splice($arr,1,1,'x');
    // $brr = array_splice($arr,1);
    // $brr = array_splice($arr,-1);

    // $brr = array_splice($arr,1,1);
    // $brr = array_splice($arr,1,-1);

    // $brr = array_splice($arr,-3,1);
    // $brr = array_splice($arr,-3,-1,['x','y']);
    $brr = array_splice($arr,-3,-1,array(array('a','b')));
    echo '<pre>';
    print_r($arr);
    echo '<hr>';
    print_r($brr);

    结果:
    Array
    (
        [0] => a
        [1] => b
        [2] => c
        [3] => Array
            (
                [0] => a
                [1] => b
            )
     
        [4] => f
    )

    Array
    (
        [0] => d
        [1] => e
    )

    array_combine --  创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 

    <?php
    $arr = ['a','b','c','d'];
    $brr = ['huanggua','mangguo','taozi','boluo'];

    // 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
    $crr = array_combine($arr,$brr);
    echo '<pre>';
    print_r($crr);
    结果:
    Array
    (
        [a] => huanggua
        [b] => mangguo
        [c] => taozi
        [d] => boluo
    )

    array_merge -- 合并一个或多个数组

    <?php
    $arr = array('xiaorui',10=>'enzhu','jingjing','user1'=>'minghui','caojie');
    $brr = array('zhangtao','hongli',10=>'fengtao','henian','user1'=>'haijing');

    //合并一个或多个数组,键名同名的后面的会把前边的覆盖掉
    $crr = array_merge($arr,$brr);

    echo '<pre>';
    print_r($crr);
    结果:
    Array
    (
        [0] => xiaorui
        [1] => enzhu
        [2] => jingjing
        [user1] => haijing
        [3] => caojie
        [4] => zhangtao
        [5] => hongli
        [6] => fengtao
        [7] => henian
    )

    array_intersect -- 计算数组的交集 
    array_diff -- 计算数组的差集 
    <?php
    $arr = array('xiaorui','enzhu','jingjing','haijing','caojie');
    $brr = array('zhangtao','enzhu','fengtao','henian','haijing');

    //获取多个数组交集
    // $crr = array_intersect($arr,$brr);

    //获取多个数组差集
    $crr = array_diff($arr,$brr);
    echo '<pre>';
    print_r($crr);

    6、数组与数据结构

    <?php
    $brr = array('zhangtao','enzhu','fengtao','henian','haijing');

    //将数组最后一个单元弹出
    // $result = array_pop($brr);

    //将一个或多个单元压入数组的末尾(入栈) 
    // $result = array_push($brr,'shenchao');


    //将数组开头的单元移出数组 
    // $result = array_shift($brr);

    //在数组开头插入一个或多个单元 
    // $result = array_unshift($brr,array('cenghao','gaolaoshi'));

    echo '<pre>';
    print_r($brr);
    print_r($result);

    array_rand --  从数组中随机取出一个或多个单元 

    <?php
    $arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

    // 从数组中随机取出一个或多个单元 
    $keys = array_rand($arr,3);
    print_r($keys);


    foreach($keys as $v){
        echo $arr[$v].'<br>';
    }
     
    shuffle -- 将数组打乱

    <?php
    $arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

    //shuffle — 将数组打乱
    shuffle($arr);
    print_r($arr);
    echo $arr[0].'<br>';
    echo $arr[1].'<br>';
    echo $arr[2];

    //建立一个包含指定范围单元的数组   
    //第一个参数开始位置(最小值) 第二个参数结束位(最大值) 第三个参数步长
    $brr = range(1,54,3);
    echo '<pre>';
    print_r($brr);








    php是世界上最好的编程语言,没有之一
  • 相关阅读:
    利用多线程对数组进行归并排序
    Java.nio-随机读写汉字
    用Java语言实现简单的词法分析器
    python全栈闯关--5-字典
    python全栈闯关--XX-细节总结汇总
    linux温故--1-daily_routine
    python全栈闯关--4-列表和元祖
    saltstack-6 pillar组件
    saltstack-5 grainx组件
    saltstack-4 常用模块api调用
  • 原文地址:https://www.cnblogs.com/lookphp/p/0dd0d83c-b6f3-4dfe-b4fe-4742204d7193.html
Copyright © 2020-2023  润新知