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

时间:2018-08-16 08:24:47

标签: php arrays sorting multidimensional-array

我在此结构中具有多维数组:

$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,但这些函数似乎无法处理字母数字值

我们将为您提供帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

此代码应执行您想要的操作。它使用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
        )
)