简体   繁体   English

按两个不同的键或值对多维数组排序

[英]Sorting multidimensional array by two different key or value

This example depends on two keys/values instead of just one unlike many other examples I've seen in Stack-overflow. 此示例依赖于两个键/值,而不是仅与我在Stack-overflow中看到的许多其他示例不同。 Apart from sorting array below by primary key, I also would like to sort it by age key so that I can achieve EXPECTED RESULT below. 除了按primary键对数组进行排序以外,我还希望按age键对数组进行排序,以便在下面实现预期的结果。 How should I modify CODE below to achieve it? 我应该如何修改下面的CODE来实现? CURRENT RESULT has A-6-6 key misplaced because my code doesn't handle it yet. CURRENT RESULT的A-6-6钥匙放错了位置,因为我的代码尚未处理它。

ORIGINAL ARRAY 原始阵列

$myarray = [
    'Z-9-0' => [
        'primary' => true,
        'age' => 55
    ],
    'C-7-1' => [
        'primary' => false,
        'age' => 60
    ],
    'K-1-9' => [
        'primary' => true,
        'age' => 60
    ],
    'C-2-1' => [
        'primary' => false,
        'age' => 40
    ],
    'F-6-6' => [
        'primary' => true,
        'age' => 60
    ],
    'A-6-6' => [
        'primary' => true,
        'age' => 30
    ]
];

EXPECTED RESULT 预期结果

(
    [F-6-6] => Array
        (
            [primary] => 1
            [age] => 60
        )
    [K-1-9] => Array
        (
            [primary] => 1
            [age] => 60
        )
    [Z-9-0] => Array
        (
            [primary] => 1
            [age] => 55
        )
    [A-6-6] => Array
        (
            [primary] => 1
            [age] => 30
        )
    [C-7-1] => Array
        (
            [primary] => 
            [age] => 60
        )
    [C-2-1] => Array
        (
            [primary] => 
            [age] => 40
        )
)

CODE

uasort($myarray, function($a, $b) {
    return strcmp($b['primary'], $a['primary']);
});

print_r($org);

CURRENT RESULT 当前结果

As you can see, A-6-6 is not in right place compared to expected result above. 如您所见,与上面的预期结果相比, A-6-6位置不合适。 So the bigger the age the higher place it should appear. 因此age越大,应该出现的位置越高。

(
    [A-6-6] => Array
        (
            [primary] => 1
            [age] => 30
        )
    [F-6-6] => Array
        (
            [primary] => 1
            [age] => 60
        )
    [K-1-9] => Array
        (
            [primary] => 1
            [age] => 60
        )
    [Z-9-0] => Array
        (
            [primary] => 1
            [age] => 55
        )
    [C-7-1] => Array
        (
            [primary] => 
            [age] => 60
        )
    [C-2-1] => Array
        (
            [primary] => 
            [age] => 40
        )
)

I think you can add an extra check for the 'age' key in the uasort when the values for the 'primary' key are equal'. 我认为当“主”键的值相等时,您可以在uasort中为“年龄”键添加额外的检查。

uasort($myarray, function($a, $b) {
    if ($b['primary'] === $a['primary']) {
        return $b['age'] > $a['age'];
    }
    return strcmp($b['primary'], $a['primary']);
});

Demo 演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM