2016-01-12 25 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 –