2017-08-27 1 views
1

Ich muss ein mehrdimensionales Array nach einem gesuchten Schlüsselwort sortieren. Mein Array ist wie folgt.Mehrdimensionales Array durch gesuchte Wörter sortieren

<?php 
array(
    array(
    'name' => '11th-Physics', 
    'branch' => 'Plus One', 
    'college' => 'Plus One', 
), 
    array(
    'name' => 'JEE-IIT', 
    'branch' => 'Physics', 
    'college' => 'IIT College', 
), 
    array(
    'name' => 'Physics', 
    'branch' => 'Bsc Physics', 
    'college' => 'College of Chemistry', 
), 
    array(
    'name' => 'Chemical Engineering', 
    'branch' => 'Civil', 
    'college' => 'Physics Training Center', 
), 
    array(
    'name' => 'Physics Education', 
    'branch' => 'Mechanical', 
    'college' => 'TBR', 
), 
) 
?> 

Ich brauche dieses Array zu sortieren, wenn Suchbegriff physics ist. Und nach dem Sortieren brauche ich das Ergebnis wie unten.

ERFORDERLICH RESULT

<?php 
array(
    array(
    'name' => 'Physics', 
    'branch' => 'Bsc Physics', 
    'college' => 'College of Chemistry', 
), 
    array(
    'name' => 'Physics Education', 
    'branch' => 'Mechanical', 
    'college' => 'TBR', 
), 
    array(
    'name' => '11th-Physics', 
    'branch' => 'Plus One', 
    'college' => 'Plus One', 
), 
    array(
    'name' => 'JEE-IIT', 
    'branch' => 'Physics', 
    'college' => 'IIT College', 
), 
    array(
    'name' => 'Chemical Engineering', 
    'branch' => 'Civil', 
    'college' => 'Physics Training Center', 
), 
) 

?> 

Das heißt ich muss zuerst durch die name das Array sortieren, die genau wie das gesuchte Stichwort ist. Dann Wildcard-Suche in name. Dann auf die nächste Taste branch und das gleiche wie oben. Gibt es irgendeine PHP-Funktion, um dieses Array wie meine Anforderung zu sortieren. Ich habe bereits asort, usort überprüft. Aber ich habe das Ergebnis nicht richtig bekommen. Hier

+0

möglich Duplikat https://stackoverflow.com/questions/96759/how-do-ich-sortiere-ein-mehrdimensionales-array-in-php –

+0

@WilliamPerron Das ist eine Sortierung nach Schlüssel. Ich muss nach Wert mit Regex sortieren. – AdhershMNair

Antwort

1

Rufen Sie einfach diese einfache Funktion, die ich für Ihre Anforderung gerade erstellt haben, es funktioniert gut :) die Auftragspriorität ändern nach Ihrem Bedarf

function sortArray($array,$itemToSearch) 
{ 
    $sortedArray = array(); 
    $priorityOrder = ['name','branch','college']; 

    foreach ($priorityOrder as $key) 
    { 
     foreach ($array as $i => $value) 
     { 
      if(strpos(strtolower($value[$key]), strtolower($itemToSearch)) === 0) 
      { 
       array_push($sortedArray, $value); 
       unset($array[$i]); 
      } 
     } 
     foreach ($array as $i => $value) 
     { 
      if(strpos(strtolower($value[$key]), strtolower($itemToSearch)) > 0) 
      { 
       array_push($sortedArray, $value); 
       unset($array[$i]); 
      } 
     } 
    } 

    return $sortedArray; 
} 
+0

Sie sind super Baji. Vielen Dank. Es funktioniert perfekt. Danke vielmals. – AdhershMNair

+0

U sind willkommen adhersh –

0

wir gehen

Also habe ich aus dem Algorithmus gestartet in this answer und modifiziert es Ihren Anforderungen zu passen. Da Sie beim Sortieren drei verschiedene "Prioritäten" haben, müssen wir einige temporäre Variablen verwenden, um die Elemente, die wir sortieren möchten, zu trennen.

// arrays used to separate each row based on the row where the word "Physics" is found 
$searchName = array(); 
$searchBranch = array(); 
$searchCollege = array(); 

// arrays used later for array_multisort 
$foundInName = array(); 
$foundInBranch = array(); 
$foundInCollege = array(); 

foreach ($var as $key => $row) { 
    if(strpos(strtolower($row['name']), 'physics') !== false) { 
     $searchName[$key] = $row['name']; 
     $foundInName[] = $row; 
    } 
    elseif(strpos(strtolower($row['branch']), 'physics') !== false) { 
     $searchBranch[$key] = $row['branch']; 
     $foundInBranch[] = $row; 
    } 
    elseif(strpos(strtolower($row['college']), 'physics') !== false) { 
     $searchCollege[$key] = $row['college']; 
     $foundInCollege[] = $row; 
    } 
} 

// Note: I use SORT_NATURAL here so that "11-XXXXX" comes after "2-XXXXX" 
array_multisort($searchName, SORT_NATURAL, $foundInName);  // sort the three arrays separately 
array_multisort($searchBranch, SORT_NATURAL, $foundInBranch); 
array_multisort($searchCollege, SORT_NATURAL, $foundInCollege); 

$sortedArray = array_merge($foundInName, $foundInBranch, $foundInCollege); 

Ausgabe $sortedArrayvar_dump() mit gibt so etwas wie:

array(5) { 
    [0]=> array(3) { 
     ["name"]=> string(12) "11th-Physics" 
     ["branch"]=> string(8) "Plus One" 
     ["college"]=> string(8) "Plus One" 
    } 
    [1]=> array(3) { 
     ["name"]=> string(7) "Physics" 
     ["branch"]=> string(11) "Bsc Physics" 
     ["college"]=> string(20) "College of Chemistry" 
    } 
    [2]=> array(3) { 
     ["name"]=> string(17) "Physics Education" 
     ["branch"]=> string(10) "Mechanical" 
     ["college"]=> string(3) "TBR" 
    } 
    [3]=> array(3) { 
     ["name"]=> string(7) "JEE-IIT" 
     ["branch"]=> string(7) "Physics" 
     ["college"]=> string(11) "IIT College" 
    } 
    [4]=> array(3) { 
     ["name"]=> string(20) "Chemical Engineering" 
     ["branch"]=> string(5) "Civil" 
     ["college"]=> string(23) "Physics Training Center" 
    } 
} 

Wie Sie 11th-Physics kommt zuerst zu sehen. Das liegt daran, dass der ASCII Wert von Zahlen niedriger ist als der von Buchstaben. Um dies zu beheben, ändern Sie die $search... Arrays, indem Sie vor der Zeichenfolge ein hohes ASCII Zeichen voranstellen.

if(strpos(strtolower($row['name']), 'physics') !== false) { 
    // if the first character is a number, prepend an underscore 
    $searchName[$key] = is_numeric(substr($row['name'], 0, 1)) ? '_'.$row['name'] : $row['name']; 
    $foundInName[] = $row; 
} 

, die die folgende Ausgabe ergibt:

array(5) { 
    [0]=> array(3) { 
     ["name"]=> string(7) "Physics" 
     ["branch"]=> string(11) "Bsc Physics" 
     ["college"]=> string(20) "College of Chemistry" 
    } 
    [1]=> array(3) { 
     ["name"]=> string(17) "Physics Education" 
     ["branch"]=> string(10) "Mechanical" 
     ["college"]=> string(3) "TBR" 
    } 
    [2]=> array(3) { 
     ["name"]=> string(12) "11th-Physics" 
     ["branch"]=> string(8) "Plus One" 
     ["college"]=> string(8) "Plus One" 
    } 
    [3]=> array(3) { 
     ["name"]=> string(7) "JEE-IIT" 
     ["branch"]=> string(7) "Physics" 
     ["college"]=> string(11) "IIT College" 
    } 
    [4]=> array(3) { 
     ["name"]=> string(20) "Chemical Engineering" 
     ["branch"]=> string(5) "Civil" 
     ["college"]=> string(23) "Physics Training Center" 
    } 
} 

Probieren Sie es here!

Verwandte Themen