二维数组排序

    xiaoxiao2021-03-25  149

    问题引入: 例如现在要对下面的二维数组按照姓名(name)的字典顺序升序排列:

    $person = array( array('num'=>'001','id'=>6,'name'=>'zhangsan','age'=>21), array('num'=>'001','id'=>7,'name'=>'ahangsan','age'=>23), array('num'=>'003','id'=>1,'name'=>'bhangsan','age'=>23), array('num'=>'001','id'=>3,'name'=>'dhangsan','age'=>23), );

     方法1:我们可以使用usort()函数,即用户自定义比较函数来对数组中的值进行排序

    /** * 按照字典顺序对姓名进行排序,返回值为负数或者false时表示第一个参数应该在前 * @param [mixed] $x * @param [mixed] $y * @return [type] [description] */ function sort_by_name($x,$y){ return strcasecmp($x['name'],$y['name']); } //usort($person,'sort_by_name'); //设置usort的第二个参数为上面排序的函数名 //或者直接使用下面匿名函数,即设置usort的第二个参数为一个匿名函数 usort($person, function($x, $y) { return strcasecmp($x['name'],$y['name']); }); var_dump($person);

    打印如果如下:

    array (size=4) 0 => array (size=4) 'num' => string '001' (length=3) 'id' => int 7 'name' => string 'ahangsan' (length=8) 'age' => int 23 1 => array (size=4) 'num' => string '003' (length=3) 'id' => int 1 'name' => string 'bhangsan' (length=8) 'age' => int 23 2 => array (size=4) 'num' => string '001' (length=3) 'id' => int 3 'name' => string 'dhangsan' (length=8) 'age' => int 23 3 => array (size=4) 'num' => string '001' (length=3) 'id' => int 6 'name' => string 'zhangsan' (length=8) 'age' => int 21

    方法2:使用array_multisort()排序

    假设二维数组结构如下:

    $users = array( array('name' => 'tom', 'age' => 20), array('name' => 'anny', 'age' => 18), array('name' => 'jack', 'age' => 22) );

    现在要按照age升序排列,则需要先将age提取出来存储到一维数组里,再用array_multisort()进行排序

    //将age提取出来存储到一维数组里 $ages = array(); foreach ($users as $user) { $ages[] = $user['age']; } //按照age升序排列 array_multisort($ages, SORT_ASC, $users); var_dump($users);

    打印结果如下:

    array (size=3) 0 => array (size=2) 'name' => string 'anny' (length=4) 'age' => int 18 1 => array (size=2) 'name' => string 'tom' (length=3) 'age' => int 20 2 => array (size=2) 'name' => string 'jack' (length=4) 'age' => int 22

    如果要先按age升序排列,再按照name升序排列,则多提取一个name数组出来:

    //将age提取出来存储到一维数组里 $ages = array(); foreach ($users as $user) { $ages[] = $user['age']; } //将name提取出来存储到一维数组里 $names = array(); foreach ($users as $names) { $names[] = $user['name']; } //先按年龄升序排列,再按照名称升序排列 array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users); var_dump($users); 打印结果如下:

    array (size=3) 0 => array (size=2) 'name' => string 'anny' (length=4) 'age' => int 18 1 => array (size=2) 'name' => string 'tom' (length=3) 'age' => int 20 2 => array (size=2) 'name' => string 'jack' (length=4) 'age' => int 22 附完整代码

    方法1:

    <?php /*二维数组排序*/ //1.使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 $person = array( array('num'=>'001','id'=>6,'name'=>'zhangsan','age'=>21), array('num'=>'001','id'=>7,'name'=>'ahangsan','age'=>23), array('num'=>'003','id'=>1,'name'=>'bhangsan','age'=>23), array('num'=>'001','id'=>3,'name'=>'dhangsan','age'=>23), ); /** * 按照字典顺序对姓名进行排序,返回值为负数或者false时表示第一个参数应该在前 * @param [mixed] $x * @param [mixed] $y * @return [type] [description] */ function sort_by_name($x,$y){ return strcasecmp($x['name'],$y['name']); } //uasort($person,'sort_by_name'); //用usort也行 //用匿名函数 usort($person, function($x, $y) { return strcasecmp($x['name'],$y['name']); }); var_dump($person); /* array (size=4) 0 => array (size=4) 'num' => string '001' (length=3) 'id' => int 7 'name' => string 'ahangsan' (length=8) 'age' => int 23 1 => array (size=4) 'num' => string '003' (length=3) 'id' => int 1 'name' => string 'bhangsan' (length=8) 'age' => int 23 2 => array (size=4) 'num' => string '001' (length=3) 'id' => int 3 'name' => string 'dhangsan' (length=8) 'age' => int 23 3 => array (size=4) 'num' => string '001' (length=3) 'id' => int 6 'name' => string 'zhangsan' (length=8) 'age' => int 21 */ 方法2:

    <?php /*二维数组排序*/ // 2.使用array_multisort排序 $users = array( array('name' => 'tom', 'age' => 20), array('name' => 'anny', 'age' => 18), array('name' => 'jack', 'age' => 22) ); //将age提取出来存储到一维数组里 $ages = array(); foreach ($users as $user) { $ages[] = $user['age']; } //将name提取出来存储到一维数组里 $names = array(); foreach ($users as $names) { $names[] = $user['name']; } //按照age升序排列 array_multisort($ages, SORT_ASC, $users); var_dump($users); /* array (size=3) 0 => array (size=2) 'name' => string 'anny' (length=4) 'age' => int 18 1 => array (size=2) 'name' => string 'tom' (length=3) 'age' => int 20 2 => array (size=2) 'name' => string 'jack' (length=4) 'age' => int 22 */ //先按年龄升序排列,再按照名称升序排列 array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users); var_dump($users); /* array (size=3) 0 => array (size=2) 'name' => string 'anny' (length=4) 'age' => int 18 1 => array (size=2) 'name' => string 'tom' (length=3) 'age' => int 20 2 => array (size=2) 'name' => string 'jack' (length=4) 'age' => int 22 */

    这里顺便说一下PHP排序的几个函数

    sort  对数组排序 一般适用于一维索引数组,不会保持索引

    rsort  对数组逆向排序 和sort用法一致

    asort  对数组进行排序并保持索引关系对值进行排序,一般适用于一维数组,保持索引关系

    arsort  对数组进行逆向排序并保持索引关系和asort用法一致

    ksort  对数组按照键名排序

    krsort  对数组按照键名逆向排序

    my github:https://github.com/lensh

    转载请注明原文地址: https://ju.6miu.com/read-21348.html

    最新回复(0)