I want to sort an array of rows by the name column value, but critically I want to sort while ignoring the users’ prefixes.
Sample array:
$ad_users = [
["name" => "Mr San", "department" => "five"],
["name" => "Mr VSan", "department" => "six"],
["name" => "Mr QSan", "department" => "four"],
["name" => "Sr ASan", "department" => "two"],
["name" => "Dr ASan", "department" => "one"],
["name" => "Dr FSan", "department" => "three"]
];
Desired result:
[
["name" => "Dr ASan", "department" => "one"],
["name" => "Sr ASan", "department" => "two"],
["name" => "Dr FSan", "department" => "three"],
["name" => "Mr QSan", "department" => "four"],
["name" => "Mr San", "department" => "five"],
["name" => "Mr VSan", "department" => "six"]
]
My current code:
for ($x = 0; $x < count($ad_users); $x++) {
$ad_users[$x]['name']= ucwords($ad_users[$x]['name']);
$end = (explode(',', $ad_users[$x]['name']));
$lastname = array_pop($end);
sort($end);
$firstname = implode(" ", $end);
$ad_users[$x]['name']=$lastname." ".$firstname;
}
sort($ad_users);
for ($x = 0; $x < count($ad_users); $x++) {
echo $ad_users[$x]['name']."n";
}
Advertisement
Answer
You make it clear in your comment that you originally have the name as firstname lastname, title, so you just need to sort first, then move the title to the front:
<?php
sort($ad_users);
// I've copied this section as-is, it looks like it could be improved
// but I can't be sure I'm making the correct improvements without seeing
// the original data
for ($x = 0; $x < count($ad_users); $x++) {
$ad_users[$x]['name']= ucwords($ad_users[$x]['name']);
$end = (explode(',', $ad_users[$x]['name']));
$lastname = array_pop($end);
sort($end);
$firstname = implode(" ", $end);
$ad_users[$x]['name']=$lastname." ".$firstname;
}
for ($x = 0; $x < count($ad_users); $x++) {
echo $ad_users[$x]['name']."n";
}
?>