Php 基于给定字符串的数组排序
我有一个php数组作为来自数据库的结果集 由于我对mySQL排序不太熟悉,所以我想根据一个特定的字符串(比如“madhapur”)对结果集进行排序 我期待的结果如下Php 基于给定字符串的数组排序,php,codeigniter,sorting,usort,Php,Codeigniter,Sorting,Usort,我有一个php数组作为来自数据库的结果集 由于我对mySQL排序不太熟悉,所以我想根据一个特定的字符串(比如“madhapur”)对结果集进行排序 我期待的结果如下 $arr=array( array("name" => 'madhapur',"population" =>'1000'), array("name" => 'madhapur',"population" =>'1000'), array("name" => 'madhapur',"population
$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就是一个例子,因为我不知道您使用的是什么DB访问方法):
然后可以迭代数组,并将元素的名称放在开头:
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;
}
有关更多详细信息,请参考
按值对多维数组进行排序,因此唯一的限制是,将
名称
作为madhapur
的数组应在开头,对吗?为什么不按MySQL对其进行排序?我需要编写存储过程,除非我不能将name作为参数传递。我想知道如何将madhapur传递给usort中的匿名函数。它不是静态的。函数(..)使用($name){..}
,其中,$name
是当前范围内的一个变量,其中包含“madhapur”。引用链接您也可以直接在SQL中执行此操作,这可能是最好的选择:我知道这一点,但为此我需要编写存储过程以将名称作为参数传递。我不想那样。
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;
}