根据给定的字符串进行数组排序
Array sorting based on the string given
我有一个 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');
要将名称 madhapur
排序到顶部,否则将元素的顺序保留为 is/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应该做的事情。
在您的 sql 中按名称和人口排序的第一个顺序,因为您的示例似乎显示了除提升到顶部的特定名称 (madhapur) 之外的所有按此方式排序的内容
(注意 DB
class 是一个例子,因为我不知道你使用什么数据库访问方法):
$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);
希望对您有所帮助
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;
}
有关更多详细信息,请参考
按值
对 Multi-dimensional 数组排序
我有一个 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');
要将名称 madhapur
排序到顶部,否则将元素的顺序保留为 is/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应该做的事情。
在您的 sql 中按名称和人口排序的第一个顺序,因为您的示例似乎显示了除提升到顶部的特定名称 (madhapur) 之外的所有按此方式排序的内容
(注意 DB
class 是一个例子,因为我不知道你使用什么数据库访问方法):
$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);
希望对您有所帮助
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;
}
有关更多详细信息,请参考 按值
对 Multi-dimensional 数组排序