繁体   English   中英

按指定的一组值对php多维数组进行排序

[英]sort php multidimensional array by specified set of values

我在这种结构中有一个多维数组:

$arr = Array 
   ( 
        [0] => Array 
            ( 
                [ref] => Q1 
            ) 
        [1] => Array 
            ( 
                [ref] => C6 
            ) 
        [2] => Array 
            ( 
                [ref] => C13 
            ) 
        [3] => Array 
            ( 
                [ref] => S3 
            ) 
        [4] => Array 
            ( 
                [ref] => Q11 
            ) 
        [8] => Array 
            ( 
                [ref] => S7 
            ) 
        [9] => Array 
            ( 
                [ref] => C4 
            ) 
   );

我想对数组进行排序,以使值的顺序为S,Q,D,C,P,E,并且如果可能的话,使每个字母数字升序,同时还要保持关联键[ref],如下所示:

Array 
   ( 
        [0] => Array 
            ( 
                [ref] => S3
            ) 
        [1] => Array 
            ( 
                [ref] => S7
            ) 
        [2] => Array 
            ( 
                [ref] => Q1
            ) 
        [3] => Array 
            ( 
                [ref] => Q11   
            ) 
        [4] => Array 
            ( 
                [ref] => C4  
            ) 
        [8] => Array 
            ( 
                [ref] => C6
            ) 
        [9] => Array 
            ( 
                [ref] => C13
            ) 
   )

我已经研究了可用的php函数(例如 usort和uasort),但这些 函数 似乎无法处理字母数字值

任何帮助表示赞赏。 谢谢!

此代码应执行您想要的操作。 它使用具有比较功能的usort ,该功能首先查看前导字符并根据您指定的顺序对它进行排序:S,Q,D,C,P,E。如果字符相同,则将比较字符的整数部分值。 现在的问题是,这会丢失密钥。 我们不能使用uasort来解决这个问题,因为它将以相应的值移动键。 为了解决这个问题,我们首先获取数组的键,然后在最后将键与排序后的数组组合:

function mysort($a, $b) {
    $sort_order = ['S', 'Q', 'D', 'C', 'P', 'E'];
    // first, sort by leading character
    $s = array_search($a['ref'][0], $sort_order) - array_search($b['ref'][0], $sort_order);
    if ($s != 0) return $s;
    // if the same, sort by numeric part
    return (int)substr($a['ref'], 1) - (int)substr($b['ref'], 1);
}
$keys = array_keys($arr);
usort($arr, 'mysort');
$arr = array_combine($keys, $arr);

输出:

Array
(
    [0] => Array
        (
            [ref] => S3
        )
    [1] => Array
        (
            [ref] => S7
        )
    [2] => Array
        (
            [ref] => Q1
        )
    [3] => Array
        (
            [ref] => Q11
        )
    [4] => Array
        (
            [ref] => C4
        )
    [8] => Array
        (
            [ref] => C6
        )
    [9] => Array
        (
            [ref] => C13
        )
)

暂无
暂无

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

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