phparrayssortingnatural-sort

Sort an array of alphanumeric strings naturally


I know there are natsort() and natcasesort() functions to sort array elements in natural order. I am trying to sort the following items.

array[0] = '10. xyz';
array[1] = '13. xyz';
array[2] = '2. xyz';
array[3] = '1a. xyz';
array[4] = '6. xyz';
array[5] = '1b. xyz';
array[6] = '4a. xyz';
array[7] = '4b. xyz';

If I apply natsort(), '10..' and '13..' are placed above '1a..'. How can I make my php code to think that '10..' is greater than '1a...' and '1a...' should be at the top?

Desired result:

'1a. xyz';
'1b. xyz';
'2. xyz';
'4a. xyz';
'4b. xyz';
'6. xyz';
'10. xyz';
'13. xyz';

I used a custom algorithm but it does the same...it places '10..' before '1a...'. heres my custom func:

function cmp($a, $b) {
    $a_ex = explode(".", $a);
    $b_ex = explode(".", $b);
    if ($a_ex[0] == $b_ex[0] ) {
        return 0;
    }
    return ($a_ex[0] < $b_ex[0]) ? -1 : 1;
}

Solution

  • Use natsort():

    $array[0]= '10. xyz';
    $array[1]=  '13. xyz';
    $array[2]=  '2. xyz';
    $array[3]=  '1a. xyz';
    $array[4]=  '6. xyz';
    $array[5]=  '1b. xyz';
    $array[6]=  '4a. xyz';
    $array[7]=  '4b. xyz';
    
    natsort($array);
    
    print_r($array);