0

これが私がやりたいことです:

$newArray = array();

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

生徒を成績(並べ替えよりもグループの方が多い)で並べ替えたいのですが、IDではなく成績を並べ替えるだけです。私はこれをしなかったかもしれません:

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

しかし、残りのデータが必要$sです。また、私が維持したい各学生に関連する膨大な量のデータがあります。

どうすればそのようなソートを実現できますか?

4

2 に答える 2

11

編集:

フレームワークで作業している場合は、ソートコールバックをメンバー関数として宣言するのが最適です(もちろん、必要な場所と同じクラス内で)。

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();
于 2012-08-30T13:18:49.537 に答える
4

あなたは次のようなことをすることができます:

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を使用する場合は、関連するメソッドを使用できます。

于 2012-08-30T13:02:43.403 に答える