2016-05-12 10 views
2

Ich möchte sortieren die folgende Array alphabetisch nach Vornamen:PHP: Sortierung ein Array von A bis

enter image description here

Was ich bisher tat:

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

Ergebnis ist:

enter image description here

Eine alphabetische Reihenfolge für alle Ärzte (Dr.) dann eine neue alphabetische Reihenfolge für alle (Herr) und schließlich eine weitere alphabetische Reihenfolge für alle (Frau), Warum ist das so? sein ein Array !!

+3

Sie haben noch ',' in deinen 'name' Werten. –

+0

'$ end = (explodieren (',', $ ad_users [$ x] ['name']));' Nein '', '' aber ''.''? –

+0

@BenjaminPoignant Ich habe ursprünglich Namen wie diese Abeer Aldoghaither, Dr. – Learner

Antwort

0

Sie machen es in Ihrem Kommentar klar, dass Sie ursprünglich den Namen als firstname lastname, title haben, so dass Sie nur zuerst sortieren müssen, dann den Titel nach vorne bewegen:

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

Sie sollten Ihre Daten vorbereiten (Entfernen Sie alle Dr., Ms., etc) und sortieren Sie dann nur gereinigte Namen.

+0

Ich kann nicht ich muss sie zeigen :) – Learner

+0

Ja, Sie können. Sie können nach gereinigten Namenswertkopien sortieren und Namen mit Präfixen anzeigen. – Taras

+0

Wie dann würde ich jetzt ihre Präfixe, ich habe 521 Mitarbeiter :) – Learner

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; 
     }); 
+0

beide Code hat ähnliche Ausgabe, Ihre Antwort und Code verwendet von @Asmaa Alharbi –

+0

Wahr, meine 'str_replace' war falsch, weil ich nicht beachtet habe $ a' und' $ b' sind Arrays. Changed es in den 'name' Teil des Arrays, sollte jetzt gut funktionieren – DarkBee

+0

Ich konnte tatsächlich Ihre Lösung nicht verstehen, oder wie Sie es verwenden – Learner

0

Zunächst all: Zähle() nicht ein konstantes Array in einer for-Schleife! Sie explodieren() mit einem nicht vorhandenen Begrenzer, so dass das resultierende Array genau ein Element enthält, das Sie mit array_pop() entfernen. Dann sort() und implode() ein leeres Array. So erhalten Sie ein zufälliges Ergebnis (in diesem Fall unverändert).

Bitte überprüfen http://php.net/usort

0

Sie können den Code als

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

prüfen ändern: https://eval.in/569467

Ausgabe wäre:

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

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

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

)