Sort rows of a 2d array based on a column's text which may contain accented characters
Asked Answered
P

2

9

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 so that accented characters are positioned near their non-accented letter?

Priggery answered 11/3, 2012 at 12:26 Comment(1)
Does this answer your question? How can I sort an array of UTF-8 strings in PHP?Companionway
H
17

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'];
}
Hersey answered 11/3, 2012 at 12:30 Comment(2)
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 '<br>'; echo $friend['name']; }Priggery
What if the strings are part of a multiple columns array and we want to sort on multiple columns?Paraprofessional
L
9

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

Lennox answered 8/4, 2020 at 14:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.