Thursday, May 10, 2012

sorting a php array alphanumerically


I know there are natsort() and natcasesort() functions in php 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';



now 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? the correct output in my particular case is:




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



i used a custom algo 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;
}


Source: Tips4all

3 comments:

  1. 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);

    ReplyDelete
  2. natsort works fine for me...

    Otherwise use str_pad to format the numbers before you sort the array.

    Or you can user usort with a custom function, maybe with intval...

    ReplyDelete
  3. use usort with your own custom algorithm

    ReplyDelete