二维数组根据指定字段排序

        数组排序,在实际开发中会经常遇到,有时候还会根据数组中的某一个字段进行排序,到底如何实现呢?

        这里总结了几种方式(默认都是以降序排序):

        1、先来看下一维数组的排序方式:

        这里先了解一下php函数:usort — 使用用户自定义的比较函数对数组中的值进行排序

//一维数组排序 降序
function my_sort($a,$b){
    if ($a > $b){
        return -1;
    }
    if ($a < $b){
        return 1;
    }
    return 0;
}

$a=array(4,2,8,6);
usort($a, "my_sort");
var_dump($a);

输出结果:
D:\wamp64\www\test.php:32:array (size=4)
  0 => int 8
  1 => int 6
  2 => int 4
  3 => int 2


        2、二维数组排序

        第一种: usort 函数,使用用户自定义的比较函数对数组进行排序,重写key;  

                      uasort函数,使用用户自定义的比较函数对数组按键值进行排序,并保持索引关联(不为元素分配新的键)

                               uasort($ary, array($this,"compareByMargin"))     

######usort##############################################
//先定义一个二维数组
$infoAry = array(
    array('id'=> 1, 'name' => '张三', 'age'  => 25, 'tm'=> '123'),
    array('id'=> 2, 'name' => '李四', 'age'  => 23, 'tm'=> '111'),
    array('id'=> 3, 'name' => '王五', 'age'  => 40, 'tm'=> '231'),
    array('id'=> 4, 'name' => '赵六', 'age'  => 31, 'tm'=> '101'),
    array('id'=> 5, 'name' => '黄七', 'age'  => 20, 'tm'=> '241'),
);


usort($infoAry, "liveTm");
var_dump($infoAry);

function liveTm($data1,$data2)
{
    if($date1['tm'] > $date2['tm'])
    {
        return -1;
    }
    return 1;
}

// function liveTm($data1,$data2)        //按一个字段排序,相等时再按另一个字段排序(价值相同,先到先得)
// {
//     if ($data1['tm'] < $data2['tm'])
//     {
//         return -1;
//     }
//     elseif ($data1['tm'] == $data2['tm'])
//     {
//         if ($data1['age'] < $data2['age'])
//         {
//             return -1;
//         }
//         else
//         {
//             return 1;
//         }
//     }
//     else
//     {
//         return 1;
//     }
// }
输出结果:
array(5) {
  [0]=>
  array(4) {
    ["id"]=>
    int(5)
    ["name"]=>
    string(6) "黄七"
    ["age"]=>
    int(20)
    ["tm"]=>
    string(3) "241"
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(6) "王五"
    ["age"]=>
    int(40)
    ["tm"]=>
    string(3) "231"
  }
  [2]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(6) "张三"
    ["age"]=>
    int(25)
    ["tm"]=>
    string(3) "123"
  }
  [3]=>
  array(4) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(6) "李四"
    ["age"]=>
    int(23)
    ["tm"]=>
    string(3) "111"
  }
  [4]=>
  array(4) {
    ["id"]=>
    int(4)
    ["name"]=>
    string(6) "赵六"
    ["age"]=>
    int(31)
    ["tm"]=>
    string(3) "101"
  }
}

####  usort 类里面使用:################################
class test
{

    public function init()
    {

        $postUserInfo = array(
            array('uid'=>1111, 'cvalue'=>1111, 'tm'=>1111),
            array('uid'=>2222, 'cvalue'=>1111, 'tm'=>2222),
            array('uid'=>3333, 'cvalue'=>3333, 'tm'=>3333),
            array('uid'=>4444, 'cvalue'=>4444, 'tm'=>4444),
        );
        usort($postUserInfo, array("test", "sortValue"));
        var_dump($postUserInfo);
    }


    public function sortValue($data1, $data2)
    {
        if ($data1['cvalue'] > $data2['cvalue'])
        {
            return -1;
        }
        elseif ($data1['cvalue'] == $data2['cvalue'])
        {
            if ($data1['tm'] < $data2['tm'])
            {
                return -1;
            }
            else
            {
                return 1;
            }
        }
        else
        {
            return 1;
        }
    }  
}
$Obj = new test();
$Obj->init();

        第二种:使用 arsort 、asort 函数,保持原key

$arrUsers = array(
    array('id'=> 1, 'name' => '张三', 'age'  => 25, 'tm'=> '123'),
    array('id'=> 2, 'name' => '李四', 'age'  => 23, 'tm'=> '111'),
    array('id'=> 3, 'name' => '王五', 'age'  => 40, 'tm'=> '231'),
    array('id'=> 4, 'name' => '赵六', 'age'  => 31, 'tm'=> '101'),
    array('id'=> 5, 'name' => '黄七', 'age'  => 20, 'tm'=> '241'),
);
mySort($arrUsers, 'tm');
var_dump($arrUsers);

function mySort(&$ary, $compareField, $seq='DESC', $sortFlag=SORT_NUMERIC) 
{
	$sortData = array();
	foreach($ary as $key => $value) {
		$sortData[$key] = $value[$compareField];
	}
	($seq == 'DESC') ? arsort($sortData, $sortFlag) : asort($sortData, $sortFlag);
	$ret = array();
	foreach($sortData as $key => $value) 
	{
		$ret[$key] = $ary[$key];
	}
	$ary = $ret;
	return $ary;
}

        第三种:使用 array_multisort 函数,key重做

$arrUsers = array(
    array('id'=> 1, 'name' => '张三', 'age'  => 25, 'tm'=> '123'),
    array('id'=> 2, 'name' => '李四', 'age'  => 23, 'tm'=> '111'),
    array('id'=> 3, 'name' => '王五', 'age'  => 40, 'tm'=> '231'),
    array('id'=> 4, 'name' => '赵六', 'age'  => 31, 'tm'=> '101'),
    array('id'=> 5, 'name' => '黄七', 'age'  => 20, 'tm'=> '241'),
);

//$arrUsers 待排序参数,`age` 二维数组字段
//根据年龄排序 ,如果要降序排序,则第二个参数改为`SORT_DESC` | SORT_ASC
//亦可根据字符串排序,只需在`SORT_ASC`后添加参数 `SORT_STRING`
array_multisort(array_column($arrUsers, 'tm'),SORT_DESC,$arrUsers);
var_dump($arrUsers);

        输出结果如图:

        冷暖自知一抹茶ck

## array_multisort 二维数组排序

$arrUsers = array(
    array('id'=> 2, 'name' => '李四', 'age'  => 23, 'tm'=> '123'),
    array('id'=> 1, 'name' => '张三', 'age'  => 25, 'tm'=> '123'),
    
    array('id'=> 3, 'name' => '王五', 'age'  => 40, 'tm'=> '231'),
    array('id'=> 4, 'name' => '赵六', 'age'  => 31, 'tm'=> '101'),
    array('id'=> 5, 'name' => '黄七', 'age'  => 20, 'tm'=> '241'),
);

array_multisort(array_column($arrUsers, 'tm'),SORT_ASC,array_column($arrUsers, 'age'),SORT_ASC,$arrUsers);
var_dump($arrUsers);


冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论