usort 对多个字段进行排序

Posted

技术标签:

【中文标题】usort 对多个字段进行排序【英文标题】:usort sorting multiple fields 【发布时间】:2012-03-04 20:15:57 【问题描述】:

是否可以使用usort 对多维数组中的多个字段进行排序?例如,我想按字母顺序对name 进行排序,然后从这些记录中按age 对它们进行排序。这可以使用sort吗?

Array ( 
    [0] => Array ( 
        [name] => Jonah 
        [age] => 27 
    )
    [1] => Array (
        [name] => Bianca 
        [age] => 32 
    )
)

【问题讨论】:

Sort multidimensional array by multiple keys的可能重复 【参考方案1】:

怎么样:

<?php

function getRandomName() 
    $possible = "ab";
    $possible_len = strlen($possible);
    $r = '';
    for ($i = 0; $i < 4; $i++) 
        $r .=  substr($possible, mt_rand(0, $possible_len-1), 1);
    
    return ucfirst($r);


$a = array();
for ($i = 0; $i < 10; $i++) 
    $a[] = array('name' => getRandomName(), 'age' => rand(1,10), 'start_order' => $i);

$order = array('name' => 'desc', 'age' => 'asc');

print_r($a);

usort($a, function ($a, $b) use ($order) 
    $t = array(true => -1, false => 1);
    $r = true;
    $k = 1;
    foreach ($order as $key => $value) 
        $k = ($value === 'asc') ? 1 : -1;
        $r = ($a[$key] < $b[$key]);
        if ($a[$key] !== $b[$key]) 
            return $t[$r] * $k;
        

    
    return $t[$r] * $k;
);

print_r($a);

【讨论】:

这个解决方案是我经过多次研究发现的最好的!它独立于您想要的排序参数数量以及升序或降序。 这绝对是最好、最通用的解决方案!【参考方案2】:
usort($arr, function($a, $b)

    $name = strcmp($a['name'], $b['name']);
    if($name === 0)
    
        return $a['age'] - $b['age'];
    
    return $name;
);

【讨论】:

出于好奇,如果我对name 进行排序,但它是一个整数(例如),而不是使用strcmp,你会推荐使用什么函数? @user1205775:只要使用简单的算术运算符就可以了。【参考方案3】:

怎么样:

$arr = Array (
    0 => Array (
        'name' => 'Jonah',
        'age' => '27',
    ),
    1 => Array (
        'name' => 'Bianca',
        'age' => '32',
    ),
    2 => Array (
        'name' => 'Jonah',
        'age' => '25',
    ),
    3 => Array (
        'name' => 'Bianca',
        'age' => '35',
    ),
);
function comp($a, $b) 
    if ($a['name'] == $b['name']) 
        return $a['age'] - $b['age'];
    
    return strcmp($a['name'], $b['name']);


usort($arr, 'comp');
print_r($arr);

输出:

Array
(
    [0] => Array
        (
            [name] => Bianca
            [age] => 32
        )

    [1] => Array
        (
            [name] => Bianca
            [age] => 35
        )

    [2] => Array
        (
            [name] => Jonah
            [age] => 25
        )

    [3] => Array
        (
            [name] => Jonah
            [age] => 27
        )

)

【讨论】:

嗨,如果要描述年龄?是return $a['age'] + $b['age']; 吗? @SweeHong:使用:return $b['age'] - $a['age']; 如果年龄是一个字符串,你可以做 strcmp($a['age'], $b['age']);

以上是关于usort 对多个字段进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Grails 映射对多个字段进行排序 :: Groovy 对多个映射条目进行排序

集合List根据多个字段进行排序

usort — 使用用户自定义的比较函数对数组中的值进行排序

usort() 自定义排序

如何按多个字段对对象数组进行排序?

如何使用简单的管理对列表中的多个字段进行排序?