読者です 読者をやめる 読者になる 読者になる

名前空間云々は置いといて、usortの別な書き方。


1.比較関数としてクラスのstaticメソッドを指定する

<?php
class ioAlbumList extends ioDataAccessBase
{
    public function selectRowset($option)
    {
        $rowset = $this->selectRowSetSimple($option);

        switch ($option->getOrder()) {
            case 'title':
                usort($rowset, array('ioAlbumList', 'compare_title'));
                break;
            case 'author':
                usort($rowset, array('ioAlbumList', 'compare_author'));
                break;
        }

        return $rowset;
    }
    
    public static function compare_title($a, $b)
    {
        return strcmp($a['title'], $b['title']);
    }

    public static function compare_author($a, $b)
    {
        return strcmp($a['author'], $b['author']);
    }
}
[EOF]


2.インスタンスメソッドを使うこともできる、らしい?

<?php
class ioAlbumList extends ioDataAccessBase
{
    public function selectRowset($option)
    {
        $rowset = $this->selectRowSetSimple($option);

        switch ($option->getOrder()) {
            case 'title':
                usort($rowset, array($this, 'compare_title'));
                break;
            case 'author':
                usort($rowset, array($this, 'compare_author'));
                break;
        }

        return $rowset;
    }
    
    public function compare_title($a, $b)
    {
        return strcmp($a['title'], $b['title']);
    }

    public function compare_author($a, $b)
    {
        return strcmp($a['author'], $b['author']);
    }
}
[EOF]


3.比較関数を無名関数としてusortに渡す

<?php
class ioAlbumList extends ioDataAccessBase
{
    public function selectRowset($option)
    {
        $rowset = $this->selectRowSetSimple($option);

        switch ($option->getOrder()) {
            case 'title':
                usort($rowset, function ($a, $b) {
                    return strcmp($a['title'], $b['title']);
                });
                break;
            case 'author':
                usort($rowset, function ($a, $b) {
                    return strcmp($a['author'], $b['author']);
                });
                break;
        }

        return $rowset;
    }
}
[EOF]


単純な比較なら3.でいいけど、キー1・キー2・キー3とソートキーが増えた場合は、無名関数とswitch文で組むとメソッドがだらだらと長くなるので2.パターンだな。
もしくは、ソート処理だけstaticで詰め込んだソートユーティリティクラスを作って1.の呼び出し方をするとか。まぁ、それは複数クラスから同じソート処理を頻繁に使う様なら、という感じかな。