【问题标题】:Array sorting based on the string given基于给定字符串的数组排序
【发布时间】:2016-01-12 13:21:18
【问题描述】:

我有一个 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');

【问题讨论】:

  • 所以唯一的限制是,name 作为madhapur 的数组应该在开头,对吧?
  • 为什么不按 MySQL 排序呢?应该更快
  • 要使用 mySQL 进行排序,我需要编写存储过程,除非我不能将名称作为参数传递。

标签: php codeigniter sorting usort


【解决方案1】:

在您的 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);

【讨论】:

  • 您也可以直接在 SQL 中执行此操作,这可能是最好的选择:stackoverflow.com/questions/14104055/…
  • 我知道这一点,但为此我需要编写存储过程以将名称作为参数传递。我不想要那个。
【解决方案2】:

要将名称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 中完成的事情。

【讨论】:

  • 我想知道如何将 madhapur 传递给 usort 中的匿名函数。它不是静态的。
  • function (..) use ($name) { .. },其中$name 是当前范围内的一个变量,其中包含“madhapur”。
【解决方案3】:

希望对你有帮助

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

更多细节请参考 按值排序多维数组

【讨论】:

猜你喜欢
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2021-05-16
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多