note 44790 added to function.usort

From: Date: Mon, 16 Aug 2004 18:11:22 +0000
Subject: note 44790 added to function.usort
Groups: php.notes 
Request: Send a blank email to php-notes+get-74767@lists.php.net to get a copy of this message
The problem with sort() (for example) is that this function is not a friend of the special characters like 'Ä', 'â' or 'ß', characters that are used in other languages than English. They are NOT valued like the normal ones, like 'A', 'a' or 'ss'. With this small script you can compare the different sort functions. The last one is a usort() one where I have included an own sort function, that equals upper and lower case AND some characters like 'ä' and 'a': <? $a = array('Ben', -1, 2.5, -2.4, 0, 234.4, '*Änni', 'Anni', '(Becker Yvonne)', 'Beckerts', 'Anna M.', 'Anna', 'anna', 'Annâ', 'Anna-Maria', 'Annamaria', '+August', 'zorro'); ?> <table border=0 cellspacing=0 cellpadding=10> <tr> <td> <b>[unsortiert]:</b><br>&nbsp;<br> <? print_array($a); ?> </td> <td> <b>sort($a):</b><br>&nbsp;<br> <? sort($a); print_array($a); ?> </td> <td> <b>sort($a, SORT_NUMERIC):</b><br>&nbsp;<br> <? sort($a, SORT_NUMERIC); print_array($a); ?> </td> <td> <b>sort($a, SORT_STRING):</b><br>&nbsp;<br> <? sort($a, SORT_STRING); print_array($a); ?> </td> <td> <b>asort($a):</b><br>&nbsp;<br> <? asort($a); print_array($a); ?> </td> <td> <b>natsort($a):</b><br>&nbsp;<br> <? natsort($a); print_array($a); ?> </td> <td> <b>usort ($a, "cmp"):</b><br>&nbsp;<br> <? function simplify_char($c) { $c = strtolower($c); $cs = array('' => array('!', '"', '/', '(', ')', '=', '?', '+', '*', '\'', '#', '|', ',', '.', ':', '-', '_'), 'a' => array('à', 'á', 'â', 'ã', 'ä', 'å'), 'ae' => array('æ'), 'c' => array('¢', 'ç'), 'd' => array('ð'), 'e' => array('è', 'é', 'ê', 'ë'), 'i' => array('í', 'î', 'ï', 'ì'), 'n' => array('ñ'), 'o' => array('œ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø'), 'oe' => array('œ'), 'p' => array('þ'), 's' => array('š'), 'ss' => array('ß'), 'u' => array('ù', 'ú', 'û', 'ü'), 'y' => array('ý', 'ÿ')); foreach ($cs as $sc => $ncs) { foreach ($ncs as $nc) $c = str_replace($nc, $sc, $c); } return $c; } function cmp ($a, $b) { $a = simplify_char($a); $b = simplify_char($b); if ($a == $b) return 0; else return ($a < $b) ? -1 : 1; } usort ($a, "cmp"); print_array($a); ?> </td> </tr> </table> <? function print_array($a) { foreach ($a as $n => $p) echo $n, ' : ', htmlentities($p), '<br>'; } ?> You can see that ' ' is NOT replaced by '', so family names are sorted first. Pay attention: Minus numbers are NOT sorted in the normal way because '-' is replaced by ''. ---- Manual Page -- http://www.php.net/manual/en/function.usort.php Edit -- http://master.php.net/manage/user-notes.php?action=edit+44790 Delete -- http://master.php.net/manage/user-notes.php?action=delete+44790&report=yes Reject -- http://master.php.net/manage/user-notes.php?action=reject+44790&report=yes Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#74767) next »