Jump to content


This topic is now archived and is closed to further replies.


Sorting values in an array

Recommended Posts

I'm not even sure if this is possible but here goes.

I have a website that uses PHP to produce a list of names from a MySQL database. However, a basic design decision I made a long time ago seems to have some back to haunt me. The names in the database are in the format 'J Bloggs' and when these are sorted into alphabetical order they are sorted by first initial. Is there a simple way to sort these names by last name? I've tried a couple of things, but neither of those worked quite right. I've tried splitting the names into an associative array, eg J => Bloggs, but this didn't work because some of the last names are the same.

Am I going to have to redesign my database? Or is it possible to sort and array by the third character of each value?

Share this post

Link to post
Share on other sites
Hmmm... If you can split them into array, then you can use one of the array sorting function. I am a bit lazy to find what you need, but one of them should work:

uksort(), usort(), uasort(), sort(), asort(), arsort(), ksort(), natsort(), and rsort().


In your case, asort() should do it:
[a href=\"http://www.php.net/asort\" target=\"_blank\"]http://www.php.net/asort[/a]

Share this post

Link to post
Share on other sites
As long as they all have that same format of a single initial and lastname

[code]SELECT SUBSTRING(name, 3) as lastname,
            SUBSTRING(name,1,1) as initial  
FROM mytablename
ORDER BY surname, initial[/code]

Share this post

Link to post
Share on other sites
Wow Barand! Thanks, that worked beautifully. But now I've discovered I've got another problem. I have another SQL query on that page that selects 2 names and generates a list. Up until a few weeks ago this list was horribly out of order because when I wrote the php initially I had neither the skill nor the time to fix that. Now I do and have the list sorted by first initial.

[code]$today = date("Y-m-d");
$result = mysql_query("SELECT DISTINCT name1,name2 FROM names WHERE date>='$today' AND tjs='Y'",$db);

$tjs =  array();
while ($myrow = mysql_fetch_array($result)) {
$tj1 = $myrow['name1'];
$tj2 = $myrow['name2'];
foreach ($tjs as $value){
printf("<option value=\"$value\">$value</option>\n");

But I can't for the life of my figure out how to sort this list by surname, which is the 3rd character of the name. Any suggestions?

Share this post

Link to post
Share on other sites
Use a custom sort function with usort().
function namesort($a, $b) {
     return strcmp(substr($a,2), substr($b,2));

usort ($tjs, 'namesort');[/code]

Share this post

Link to post
Share on other sites


Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.