search

Home  >  Q&A  >  body text

PHP a multidimensional array sorting problem

This problem is somewhat similar to order by in Mysql. What is needed is to simulate the sorting of different fields in the array.

Suppose there is the following array:

$beforeSort = [
    "0" => ["name" => "Zhang San", "english" => 80, "chinese" => 60, "math" => 50 ],
    "1" => ["name" => "李思", "english" => 50, "chinese" => 60, "math" => 70 ],
    "2" => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ],
];

Now you need to follow the chinese order in the array. If they are the same, follow the math order. The final result should be the following array:

$afterSort = [
    "2" => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ],
    "0" => ["name" => "Zhang San", "english" => 80, "chinese" => 60, "math" => 50 ],
    "1" => ["name" => "李思", "english" => 50, "chinese" => 60, "math" => 70 ],
];

Do you have any different ways to achieve this?

滿天的星座滿天的星座2748 days ago586

reply all(9)I'll reply

  • ringa_lee

    ringa_lee2017-05-16 13:10:20

    This is the version I use myself. How to use it:

    $afterSort = getArraySort($beforeSort, 'chinese', 'SORT_ASC', 'math', 'SORT_ASC');
    /**
     * 二维数组排序(数字索引数组将重建索引)
     * @param array $arr 需要排序的数组 二维数组
     * @param string $arg1 排序的键名或字段名
     * @param string $arg2 排序的顺序 SORT_ASC或SORT_DESC
     * @param string $arg3 排序的方法 SORT_REGULAR
     * @return array
     */
    function getArraySort($arr, $arg1, $arg2 = "SORT_ASC", $arg3 = "SORT_REGULAR")
    {
        if (!is_array($arr) || !$arr)
        {
            return $arr;
        }
        $argcount = func_num_args();
        for ($i = 1; $i < $argcount; $i++)
        {
            $arg = func_get_arg($i);
            if (!preg_match("/SORT_(.*)/i", $arg))
            {
                $keynamelist[] = $arg;
                $sortrule[] = '$' . $arg;
            }
            else
            {
                $sortrule[] = $arg;
            }
        }
        foreach ($arr AS $key => $info)
        {
            foreach ($keynamelist AS $keyname)
            {
                ${$keyname}[$key] = $info[$keyname];
            }
        }
        $evalstring = 'array_multisort(' . join(",", $sortrule) . ',$arr);';
        eval($evalstring);
        return $arr;
    }

    reply
    0
  • 迷茫

    迷茫2017-05-16 13:10:20

        $beforeSort = [
            "0"  => ["name" => "张三", "english" => 80, "chinese" => 60, "math" => 50 ],
            "1"  => ["name" => "李四", "english" => 50, "chinese" => 60, "math" => 70 ],
            "2"  => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ],
        ];
        
        $arr = array();
        foreach($beforeSort as $value) {
            $arr[$value['chinese']][$value['math']] = $value;
        }
        sort($arr);
        
        $result = array();
        foreach($arr as $val) {
            sort($val);
            foreach($val as $vo) {
                $result[] = $vo;
            }
        }
        
        var_dump($result);die;
        

    Print results:

        array(3) {
          [0]=>
          array(4) {
            ["name"]=>
            string(6) "老王"
            ["english"]=>
            int(30)
            ["chinese"]=>
            int(50)
            ["math"]=>
            int(80)
          }
          [1]=>
          array(4) {
            ["name"]=>
            string(6) "张三"
            ["english"]=>
            int(80)
            ["chinese"]=>
            int(60)
            ["math"]=>
            int(50)
          }
          [2]=>
          array(4) {
            ["name"]=>
            string(6) "李四"
            ["english"]=>
            int(50)
            ["chinese"]=>
            int(60)
            ["math"]=>
            int(70)
          }
        }
        
        
    

    reply
    0
  • 大家讲道理

    大家讲道理2017-05-16 13:10:20

    You can convert arrays into sets and then process them. The sort method implemented using PHP collections specializes in various complex sorting

    reply
    0
  • PHPz

    PHPz2017-05-16 13:10:20

    <?php
    //Now you need to follow the chinese order in the array. If they are the same, follow the math order. The final result should be the following array:
    $beforeSort = [

    "0"  => ["name" => "张三", "english" => 80, "chinese" => 60, "math" => 50 ],
    "1"  => ["name" => "李四", "english" => 50, "chinese" => 60, "math" => 70 ],
    "2"  => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ],

    ];

    $data_math = array_column($beforeSort,'math');
    $data_chinese = array_column($beforeSort,'chinese');
    array_multisort($data_chinese,SORT_ASC,$data_math,SORT_ASC,$beforeSort);
    print_r($beforeSort );

    reply
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-16 13:10:20

    $beforeSort = [
        "0"  => ["name" => "张三", "english" => 80, "chinese" => 60, "math" => 80 ],
        "1"  => ["name" => "李四", "english" => 50, "chinese" => 60, "math" => 70 ],
        "2"  => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ],
    ];
    
    usort($beforeSort, function($a, $b) {
        return [$a['chinese'], $a['math']] <=> [$b['chinese'], $b['math']];
    });
    
    var_dump($beforeSort);

    reply
    0
  • 大家讲道理

    大家讲道理2017-05-16 13:10:20

    ///Borrowing the answer from the guy upstairs

    usort($beforeSort, function ($a, $b) {
        return [$a['chinese'], $b['math']] <=> [$b['chinese'], $a['math']];
    });

    reply
    0
  • 某草草

    某草草2017-05-16 13:10:20

    For sorting multi-dimensional arrays, there is an official function that can implement array_multisort

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:10:20

    $beforeSort = [
        "0"  => ["name" => "张三", "english" => 80, "chinese" => 60, "math" => 80 ],
        "1"  => ["name" => "李四", "english" => 50, "chinese" => 60, "math" => 70 ],
        "2"  => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ]
    ];
    
    foreach( $beforeSort as $key => $value )
    {
        $chinese[$key] = $value['chinese'];
        $math[$key] = $value['math'];
    }
    
    array_multisort( $chinese, SORT_ASC, $math, SORT_DESC, $beforeSort );
    
    echo '<pre>';
    print_r($beforeSort);

    reply
    0
  • 天蓬老师

    天蓬老师2017-05-16 13:10:20

    $beforeSort = [

    "0"  => ["name" => "张三", "english" => 80, "chinese" => 60, "math" => 50 ],
    "1"  => ["name" => "李四", "english" => 50, "chinese" => 60, "math" => 70 ],
    "2"  => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ],

    ];

    foreach ($beforeSort as $key => $value) {

    $chinese[$key] =  $value['chinese'];
    $math[$key] =  $value['math'];

    }
    array_multisort($chinese, SORT_ASC, $math, SORT_ASC, $beforeSort);
    print_r($beforeSort);

    reply
    0
  • Cancelreply