我有一个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 :(得分:2)
您的sql中的名称和人口的第一个顺序,因为您的示例似乎显示除了特定名称(madhapur)提升到顶部之外以这种方式排序的所有内容
(注意DB
类是一个例子,因为我不知道你使用的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);
答案 1 :(得分:1)
要将名称madhapur
排序到顶部,否则将元素的顺序保留为/ random:
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中完成。
答案 2 :(得分: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;
}
有关详细信息,请参考 按值排序多维数组