Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:按字母顺序排序数组_Php_Arrays_Sorting - Fatal编程技术网

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
        )

)