PHP:按字母顺序排序数组
我想按名字的字母顺序对以下数组进行排序: 到目前为止我所做的:PHP:按字母顺序排序数组,php,arrays,sorting,Php,Arrays,Sorting,我想按名字的字母顺序对以下数组进行排序: 到目前为止我所做的: <?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 = implod
<?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";
}
?>
结果是:
所有医生(医生)按字母顺序排列,然后是所有医生(先生)按字母顺序排列,最后是所有医生(女士)按字母顺序排列,这是为什么?这是一个数组 您应该准备好数据(删除所有医生、女士等),然后只对清理过的姓名进行排序。您在评论中明确指出,您最初的姓名为
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";
}
?>
首先:不要在for循环中计算()常量数组!
使用不存在的分隔符分解(),因此生成的数组正好有一个元素,可以使用array_pop()删除该元素。然后对空数组进行排序()和内爆()。
所以你会得到一个随机的结果(在本例中是不变的)
请检查您可以将代码更改为
<?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);
?>
您的名称值中没有,
。$end=(explode(',',$ad_users[$x]['name'])代码>没有,“
但是”。
?@BenjaminPoignant我原来的名字是这样的Abeer Aldoghaither,你是从DB加载这些值的吗?如果是这样,为什么不在查询中应用排序?如果您有DB开发权限,您还应该将name
拆分为title
,lastname
,firstname
是的,您可以。您可以对清理后的名称值副本进行排序,并显示带有前缀的名称。我现在如何使用它们的前缀,我有521名员工:)可能的前缀数量有限(少于10个)。首先找到它们,然后复制名称,让我们称之为名称排序,清除所有可能的前置项,然后按其排序。两个代码都有类似的输出,您的答案和@Asmaa AlharbiTrue使用的代码,我的str\u replace
不正确,因为我没有注意到$a
和$b
是数组。将其更改为数组的名称
部分,现在应该可以正常工作了。我实际上不理解您的解决方案,也不知道如何使用它。只需将$array
替换为您的数组,$ad\u users
,然后输出名称,就像将$array替换为您的数组,$ad\u users并使用print\r($ad\u users);在那个密码之后
<?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
)
)