2016-01-12 2 views
2

J'ai un tableau php provenant de la base de données.Tri du tableau basé sur la chaîne donnée

que je suis moins familier avec le tri mySQL, je veux trier mes jeu de résultats sur la base d'une chaîne particulière dire « Madhapur »

$arr=array( 
    array("name" => 'madhapur',"population" =>'1000'), 
    array("name" => 'jubiliee hills',"population" =>'800'), 
    array("name" => 'madhapur',"population" =>'900'), 
    array("name" => 'adikmet',"population" =>'200'), 
    array("name" => 'sr nagar',"population" =>'3000'), 
    array("name" => 'jubilee hills',"population" =>'1200'), 
    array("name" => 'madhapur',"population" =>'1000') 
    ); 

J'attends le résultat comme ci-dessous

$arr=array(
array("name" => 'madhapur',"population" =>'1000'), 
array("name" => 'madhapur',"population" =>'1000'), 
array("name" => 'madhapur',"population" =>'900'), 
array("name" => 'adikmet',"population" =>'200'), 
array("name" => 'jubilee hills',"population" =>'1200'), 
array("name" => 'jubiliee hills',"population" =>'800'), 
array("name" => 'sr nagar',"population" =>'3000'), 
); 

J'ai essayé d'utiliser usort, mais tous sont utilisés pour trier soit décroissant ou ascendant.

function sortByName($a,$b){ 
     return $b['name'] - $a['name']; 
    } 
usort($arr,'sortByName'); 
+0

La seule contrainte est, avec des tableaux 'name' comme' madhapur' devrait venir à le début, non? –

+0

oui basé sur le nom – saikiran

+0

Pourquoi ne pas le trier par MySQL? devrait être plus rapide –

Répondre

1

Pour trier le nom madhapur vers le haut et sinon laisser l'ordre des éléments tout comme/aléatoire:

usort($arr, function (array $a, array $b) { 
    $a = $a['name'] == 'madhapur'; 
    $b = $b['name'] == 'madhapur'; 

    if ($a == $b || (!$a && !$b)) { // both equal or both not madhapur 
     return 0; 
    } else if ($a) { 
     return -1; 
    } else { 
     return 1; 
    } 
}); 

Mais ce qui est vraiment quelque chose qui devrait être fait dans SQL.

+0

Je me demande comment passer ce madhapur à la fonction anonyme dans l'usort. ce n'est pas statique. – saikiran

+0

'function (..) use ($ name) {..}', où '$ name' est une variable de la portée courante qui contient 'madhapur'. – deceze

2

Première commande par son nom et la population dans votre sql, comme exemple semble montrer tout ordre de cette manière à part le nom spécifique (Madhapur) promu haut

(note DB classe est un exemple parce que je ne sais pas ce que db méthodes d'accès que vous utilisez):

$arr = DB::Query("SELECT name, population 
        FROM tablename 
        ORDER BY name ASC, population DESC"); 

alors vous pouvez itérer le tableau et placer les éléments avec le nom que vous voulez au début:

function nameAtFront($arr, $name){ 

    $copy = $arr; 
    $total = count($arr); 
    while($total--){ 
     if($copy[$total]['name']==$name){ 
      unset($arr[$total]); 
      array_unshift($arr, $copy[$total]); 
     } 
    } 
    return $arr; 
} 
$out = nameAtFront($arr, 'madhapur'); 
var_dump($out); 
+0

Vous pouvez le faire directement dans SQL, ce qui serait probablement la meilleure option: http://stackoverflow.com/questions/14104055/ordering-by-specific-field-value-first – Steve

+0

Je le sais mais pour cela je besoin d'écrire une procédure stockée pour passer le nom en paramètre. je ne veux pas ça. – saikiran

0

J'espère que cela vous aidera

function aasort (&$array, $key) { 
$sorter=array(); 
$ret=array(); 
reset($array); 
foreach ($array as $ii => $va) { 
    $sorter[$ii]=$va[$key]; 
} 
asort($sorter); 
foreach ($sorter as $ii => $va) { 
    $ret[$ii]=$array[$ii]; 
} 
$array=$ret; 
} 

pour plus de détails se référence à partir Trier tableau multidimensionnel par la valeur

+0

Lien de référence http://stackoverflow.com/questions/2699086/sort-multi-dimensional-array-by-value –