2016-01-12 53 views
2

我有一個php數組作爲結果集來自數據庫。基於給定字符串的數組排序

,就像我跟MySQL的排序不太熟悉,我要作爲排序依據的一個特定的字符串我的結果集說「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') 
    ); 

我期待的結果如下

$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'), 
); 

我嘗試使用usort,但所有這些都用於降序或升序排序。

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

所以,唯一的限制是,數組用'name'爲'madhapur'都要在一開始吧? –

+0

是基於名稱 – saikiran

+0

爲什麼不用MySQL對它進行排序?應該更快 –

回答

1

的名稱madhapur排序頂端和否則保留元素的順序是/隨機:

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

但是,這真的是一件應該在SQL來完成。

+0

我想知道如何將這個madhapur傳遞給usort中的匿名函數。它不是靜態的。 – saikiran

+0

'function(..)use($ name){..}',其中'$ name'是當前作用域中包含'madhapur'的變量。 – deceze

2

的名字和人口在SQL第一份訂單,爲您的例子似乎顯示一切以這種方式除了特定名稱(madhapur)下令晉升到頂級

(注意:DB類是因爲我的例子不知道是什麼數據庫您使用的接入方式):

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

,那麼你可以遍歷數組,並把你想在一開始的名字的元素:

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

你可以直接在SQL中這樣做,這可能是最好的選擇:http://stackoverflow.com/questions/14104055/ordering-by-specific-field-value-first – Steve

+0

我知道這一點,但爲這個我需要編寫存儲過程來傳遞名稱作爲參數。我不想那樣。 – saikiran

0

我希望這會幫助你

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

了更詳細的價值採取從 排序多維數組引用

+0

參考鏈接 http://stackoverflow.com/questions/2699086/sort-multi-dimensional-array-by-value –