以下是我想要做的:
$newArray = array();
foreach($student as $s){
$newArray[$s->id][$s->grade] = $s;
}
我想根据学生的成绩对他们进行排序(更像是一个群体,而不是一个排序),但我只想对成绩进行排序,而不是id。我本可以不这样做:
$newArray[$s->id] = $s->grade
asort($newArray)
但是我需要CCD_ 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();
您可以执行以下操作:
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,则可以使用其关联的方法。