Я хочу отсортировать следующий массив в алфавитном порядке по имени:

enter image description here

Что я сделал до сих пор:

<?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";
}
?>

Результат:

enter image description here

Алфавитный порядок для всех врачей (доктор), затем новый алфавитный порядок для всех (г-н) и, наконец, еще один алфавитный порядок для всех (г-жа), Почему? его один массив !!

2
Learner 12 Май 2016 в 11:37

5 ответов

Лучший ответ

В своем комментарии вы четко указываете, что изначально у вас есть имя 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";
}
?>
0
Jason 12 Май 2016 в 08:45
    <?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
DarkBee 12 Май 2016 в 09:03

Вы должны подготовить свои данные (удалить всех Dr., Ms. и т. Д.), А затем отсортировать только очищенные имена.

0
Taras 12 Май 2016 в 08:42

Прежде всего: не используйте count () постоянного массива в цикле for! Вы explode () с несуществующим разделителем, поэтому в результирующем массиве есть ровно один элемент, который вы удаляете с помощью array_pop (). Затем вы sort () и implode () пустой массив. Так вы получите случайный (в данном случае неизменный) результат.

Пожалуйста, проверьте http://php.net/usort

0
Adam P. 12 Май 2016 в 08:49

Вы можете изменить свой код как

<?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);
?>

Проверьте здесь: https://eval.in/569467

Результат будет:

Array
(
    [0] => Array
        (
            [name] => Mr. aaa
        )

    [1] => Array
        (
            [name] => Dr.    bbb
        )

    [2] => Array
        (
            [name] => Ms.  ccc
        )

)
0
Niklesh Raut 12 Май 2016 в 09:10