排序关联数组codeigniter php

排序关联数组codeigniter php,php,arrays,codeigniter,sorting,Php,Arrays,Codeigniter,Sorting,以下是我想做的: $newArray = array(); foreach($student as $s){ $newArray[$s->id][$s->grade] = $s; } 我想根据学生的成绩对他们进行排序(更多的是分组而不是排序),但我只想对成绩进行排序,而不是id。我可以不这样做: $newArray[$s->id] = $s->grade asort($newArray) 但是我需要$s中的剩余数据。此外,我还想维护与每个学生相关的大量数据

以下是我想做的:

$newArray = array();

foreach($student as $s){
    $newArray[$s->id][$s->grade] = $s;
}
我想根据学生的成绩对他们进行排序(更多的是分组而不是排序),但我只想对成绩进行排序,而不是id。我可以不这样做:

$newArray[$s->id] = $s->grade 
asort($newArray)
但是我需要
$s
中的剩余数据。此外,我还想维护与每个学生相关的大量数据


如何实现这样的排序?

您可以执行以下操作:

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,则可以使用其关联方法。

编辑:

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

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


我试过这件衣服,它不太擅长这类东西,但它确实奏效了:

$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);
但是,由于您使用的是框架,您可以将该函数声明为成员函数
私有函数sortCB(array$a,array$b)
,并像这样使用它:

uasort($foo,array($this, 'sortCB'));
关于如何在类上下文中最好地使用此回调函数,可能还有更多信息


完整示例+用法(已测试并可用):


我认为公平地说,数据来自数据库,为什么不按等级顺序描述呢?啊,这里不是这样。我更新了我的答案,并提供了一个完整的、经过测试的、有效的例子,说明如何在类中使用uasort。它应该可以工作,对我来说是这样的,至少(在PHP5.2和5.3中工作)codeigniter会允许,uv在usort函数中做了什么?@user1537158 codeigniter是用php编写的框架,所以它不能禁止php做它支持的事情。唯一的限制是php版本。aaah不受支持,我的IDE在usort函数下面给了我一条亮红线。您的php版本可能不支持任何函数,只需像任何其他(
function sortCB($a,$b){…}
一样定义函数,并使用
usort($newArray,'sortCB'));
@user1537158在同一文件中的控制器类之外定义回调。
$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);
uasort($foo,array($this, 'sortCB'));
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();