8

I am using this to sort according to last name:

  usort($fb_friends['data'], "custom_sort");          
  function custom_sort($a,$b) { 
    return $a['last_name']>$b['last_name'];
  }

  foreach($fb_friends['data'] as $friend) { 
    echo '<br>'; 
    echo $friend['name']; 
  } 

But - when in last name is accent, e.g. Šiko, Áron, etc, these names are at the end. How can I sort it properly?

peter
  • 3,823
  • 10
  • 38
  • 65

2 Answers2

16

Use multi-byte string functions. There is a function called strcoll which seems to suit your needs.

More info:


EDIT: added Peter's working code, below

setlocale(LC_COLLATE, 'sk_SK.utf8');

usort($fb_friends['data'], 'custom_sort');

function custom_sort($a, $b) {
    return strcoll ($a['last_name'], $b['last_name']);
}

foreach ($fb_friends['data'] as $friend) {
    echo '<br>';
    echo $friend['name'];
}
JerabekJakub
  • 5,021
  • 4
  • 24
  • 32
J. Bruni
  • 19,872
  • 12
  • 73
  • 91
  • 1
    thank you! this works for me: setlocale(LC_COLLATE, 'sk_SK.utf8'); usort($fb_friends['data'], "custom_sort"); function custom_sort($a,$b) { return strcoll ($a['last_name'], $b['last_name']); } foreach($fb_friends['data'] as $friend) { echo '
    '; echo $friend['name']; }
    – peter Mar 11 '12 at 12:46
  • What if the strings are part of a multiple columns array and we want to sort on multiple columns? – Pierre Mar 22 '16 at 18:32
4

What comes first?

  • A
  • a
  • ث

This is defined by a Collation.

PHP has the Collator class for this: https://www.php.net/manual/en/class.collator.php

Example:

$array = [ 'A', 'a', '文', 'ث' ];

// Brazilian Portuguese
$collator = new Collator('pt_BR');

$collator->asort( $array );

print_r( $array );

Returns:

Array
(
    [1] => a
    [0] => A
    [3] => ث
    [2] => 文
)

Now with a Chinese collation new Collator('zh'):

Array
(
    [2] => 文
    [1] => a
    [0] => A
    [3] => ث
)

You can try it yourself here: https://3v4l.org/0vsBR

Lucas Bustamante
  • 13,827
  • 7
  • 77
  • 75