【问题标题】:sort associative array codeigniter php排序关联数组codeigniter php
【发布时间】:2012-08-25 05:01:07
【问题描述】:

这是我想做的:

$newArray = array();

foreach($student as $s){
    $newArray[$s->id][$s->grade] = $s;
}

我想按学生的成绩对学生进行排序(与其说是排序,不如说是一组),但我只想对成绩进行排序,而不是按 id 排序。我本来可以不这样做的:

$newArray[$s->id] = $s->grade 
asort($newArray)

但我需要$s 中的剩余数据。此外,我想维护与每个学生相关的大量数据。

我怎样才能实现这样的排序?

【问题讨论】:

  • 我认为可以公平地说数据来自数据库,为什么不ORDER BY grade DESC
  • 不,这里不是这样
  • 我已经更新了我的答案,并提供了一个完整的、经过测试的和有效的示例,说明如何在课堂上使用 uasort。它应该工作,至少对我有用(在 php 5.2 和 5.3 中工作)

标签: php arrays codeigniter sorting


【解决方案1】:

编辑:

如果你在一个框架中工作,最好将你的排序回调声明为一个成员函数(当然,在你需要它的同一个类中):

private function sortCB(array $a, array $b)
{//the array type hinting in arguments is optional
    $i = array_keys($a);//but highly recommended 
    $j = array_keys($b);
    if (end($i) === end($j))
    {
        return 0;
    }
    //replace '>' with '<' if you want to sort descending
    return (end($i) > end($j) ? 1 : -1);//this is ascending
}

那么,在需要实际排序的方法中:

uasort($theArray,array($this,'sortCB'));

有关更多示例,请参阅the docs。我在这个(庞大的)答案的末尾添加了一个完整的类示例


我在writecodeonline 上试过这个,它不太擅长这种东西,但这确实奏效了:

$foo = array_fill_keys(array('foo','bar','q','Bond'),array());
$i = '256';
foreach($foo as $k=>$v)
{
    $foo[$k][$i] = $k;
    $i = (string)((int)$i%2 === 0 ? ((int)$i/2)+1 : (int)$i*3);
}
function sortCB($a,$b)
{
    $i = array_keys($a);
    $j = array_keys($b);
    if (end($i) === end($j))
    {
        return 0;
    }
    return (end($i) > end($j) ? 1 : -1);
}
uasort($foo,'sortCB');
var_dump($foo);

但由于您使用的是框架,您最好将该函数声明为成员函数private function sortCB(array $a,array $b),并像这样使用它:

uasort($foo,array($this, 'sortCB'));

可能有更多关于如何在类上下文here中使用此回调函数的更多信息


完整示例 + 用法(经过测试和工作):

class test
{
    public $foo = null;
    public function __construct()
    {
        $this->foo = array_fill_keys(array('foo','bar','q','Bond'),array());
        $i = '256';
        foreach($this->foo as $k=>$v)
        {
            $this->foo[$k][$i] = $k;
            $i = (string)((int)$i%2 === 0 ? ((int)$i/2)+1 : (int)$i*3);
        }
    }
    private function sortCB($a,$b)
    {
        $i = array_keys($a);
        $j = array_keys($b);
        if (end($i) === end($j))
        {
            return 0;
        }
        return (end($i) > end($j) ? 1 : -1);
    }
    public function sortFoo()
    {
        uasort($this->foo,array($this,'sortCB'));
        print_r($this->foo);
        return $this->foo;
    }
}
$bar = new test();
$arr = $bar->sortFoo();

【讨论】:

    【解决方案2】:

    你可以这样做:

    foreach($student as $s){
        $newArray[$s->id] = $s;
    }
    
    usort($newArray, function ($a, $b) { return $a->grade - $b->grade; });
    

    编辑

    对于不支持匿名函数的后续版本,可以先定义比较函数:

    function sortByGrade($a, $b)
    {
        return $a->grade - $b->grade;
    }
    
    usort($newArray, 'sortByGrade');
    

    但是,如果您从 db 获取此数据,则在您的 sql 查询中对其进行排序会更容易。如果你使用 ORM,你可以使用它的关联方法。

    【讨论】:

    • codeigniter 是否允许这样做,在 usort 函数中 uv 做了什么?
    • @user1537158 codeigniter 是用php编写的框架,所以它不能禁止php做它支持的事情。唯一的限制可以是 php 版本。
    • aaah not supported ,我的 IDE 在 usort 函数下方给了我一条鲜红线
    • 您的 php 版本可能不支持匿名函数,只需像其他任何函数一样定义函数(function sortCB($a,$b){...} 并使用 usort($newArray,'sortCB');
    • @user1537158 在同一个文件中定义控制器类之外的回调。
    猜你喜欢
    • 2011-02-26
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多