使用数字和字母对多维数组进行排序

时间:2017-03-08 16:16:41

标签: php arrays sorting multidimensional-array

如何对多维数组进行排序。这就是我的数组的样子

[0] => Array
    (
      [id] => 1
      [title] => 3A
      [active] => 1
    )
[1] => Array
    (
      [id] => 1
      [title] => A
      [active] => 1
    )
[2] => Array
    (
      [id] => 1
      [title] => 2A
      [active] => 1
    )
[3] => Array
    (
      [id] => 1
      [title] => B
      [active] => 1
    )

我已经尝试了几种usort方法,但似乎无法使其工作。我需要对数组进行排序,以便按数字排序,然后按字母数字排序,如:A,B,2A,3A。 我不确定如果没有添加一个位置字段来指示标题所假设的顺序,或者我在这里遗漏了什么,我是否可以这样做?

3 个答案:

答案 0 :(得分:1)

你可以建立一个"密钥"对于数字部分在左边用0填充的每个项目,这样,sort函数可以执行简单的字符串比较:

a

demo

此技术称为" Schwartzian Transform"。

答案 1 :(得分:0)

正如@Kargfen所说,你可以使用usort和你的自定义功能。像这样:

usort($array, function(array $itemA, array $itemB) {
   return myCustomCmp($itemA['title'], $itemB['title']);
}); 

function myCustomCmp($titleA, $titleB) {
    $firstLetterA = substr($titleA, 0, 1);
    $firstLetterB = substr($titleB, 0, 1);

    //Compare letter with letter or number with number -> use classic sort
    if((is_numeric($firstLetterA) && is_numeric($firstLetterB)) || 
    (!is_numeric($firstLetterA) && !is_numeric($firstLetterB)) ||
    ($firstLetterA === $firstLetterB)
    ) {
        return strcmp($firstLetterA, $firstLetterB);
    }

    //Letters first, numbers after
    if(! is_numeric($firstLetterA)) {
        return -1;
    }

    return 1;
}

这个比较功能只是基于你的标题的第一个字母,但它可以完成这项工作; - )

答案 2 :(得分:0)

您可以通过usort和自定义回调来解决该问题:

function customSort($a, $b)
{
    if ($a['id'] == $b['id']) {
        //if there is no number at the beginning of the title, I add '1' to temporary variable
        $aTitle = is_numeric($a['title'][0]) ? $a['title'] : ('1' . $a['title']);
        $bTitle = is_numeric($b['title'][0]) ? $b['title'] : ('1' . $b['title']);

        if ($aTitle != $bTitle) {
            return ($aTitle < $bTitle) ? -1 : 1;
        }
        return 0;
    }
    return ($a['id'] < $b['id']) ? -1 : 1;
}

usort($array, "customSort");

首先,该功能会比较&#39; id&#39;值,然后如果两个项目相等,则检查标题&#39;值。