PHP 一个多维数组排序的问题

查看:91
本文介绍了PHP 一个多维数组排序的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

这个问题有点类似 Mysql 中 order by ,需要的就是在数组中模拟对不同字段的排序。

假如有以下数组:

$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 ],
];

现在需要在数组中按照 chinese 顺序,假如有相同,就按 math 顺序,最后得到的应该是如下的数组:

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

请问大家有什么不同的方法可以实现?

解决方案

这是我自己使用的版本,使用方法:

$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;
}

这篇关于PHP 一个多维数组排序的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆