Php 基于给定字符串的数组排序

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

我有一个php数组作为来自数据库的结果集

由于我对mySQL排序不太熟悉,所以我想根据一个特定的字符串(比如“madhapur”)对结果集进行排序

我期待的结果如下

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