我想按名字的字母顺序对以下数组进行排序:
到目前为止我做了什么:
<?php
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";
}
?>
结果是:
所有医生(博士)的字母顺序然后是所有(先生)的新字母顺序,最后是所有(女士)的另一个字母顺序, 为什么? 它的一个阵列!!
答案 0 :(得分:1)
<?php
uasort($array, function($a, $b) {
$needles = ['Dr.', 'Ms.', ];
$a = trim(str_replace($needles,'', $a['name']));
$b = trim(str_replace($needles,'', $b['name']));
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
答案 1 :(得分:0)
您应准备数据(删除所有博士,女士等),然后仅对清理过的名称进行排序。
答案 2 :(得分:0)
您在评论中明确说明您最初的名称为firstname lastname, title
,因此您只需要先排序,然后将标题移到前面:
<?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";
}
?>
答案 3 :(得分:0)
首先:不要在for循环中计算()一个常量数组! 您使用不存在的分隔符来爆炸(),因此生成的数组只有一个元素,您可以使用array_pop()删除它。然后你排序()和implode()一个空数组。 所以你得到一个随机的(在这种情况下没有变化)结果。
答案 4 :(得分:0)
您可以将代码更改为
<?php
function sortByOrder($a, $b) {
$prefix = ['Mr.', 'Ms.','Dr.'];
$a = trim(str_replace($prefix,"", $a['name']));
$b = trim(str_replace($prefix,"", $b['name']));
return $a > $b;
}
$myArray = array(
array("name"=>"Dr. bbb"),
array("name"=>"Mr. aaa"),
array("name"=>"Ms. ccc")
);
$abc = usort($myArray, 'sortByOrder');
print_r($myArray);
?>
输出将是:
Array
(
[0] => Array
(
[name] => Mr. aaa
)
[1] => Array
(
[name] => Dr. bbb
)
[2] => Array
(
[name] => Ms. ccc
)
)