排序关联数组笨PHP(sort associative array codeigniter php)

2019-09-21 22:54发布

这是我想做的事:

$newArray = array();

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

我想通过自己的成绩给学生分类(不是一种更有一批),但我只是想成绩为不排序的ID。 我可以不这样的:

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

但我需要在剩下的数据$s 。 此外,还有与我想保持每个学生相关的数据的大块。

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

Answer 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'));

有关更多示例,请参阅该文档 。 我在这(大件)的回答最后增加了一个完整的类实例


我已经试过这对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'));

有可能是对如何最好地在一类环境中使用该回调函数的一些更多的信息在这里


完整的例子+用法(测试和工作):

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();


Answer 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');

但是,如果你从数据库获取这些数据会更容易把它订购你的SQL查询。 如果你使用ORM,你可以使用它的相关方法。



文章来源: sort associative array codeigniter php