ブログTOP > PHP > クラス内部でのusortの比較関数の指定方法

2011年01月20日

クラス内部でのusortの比較関数の指定方法

クラス内部でusort(ユーザー定義の比較関数を使用して、配列を値でソートする)を使う場合、比較関数も同じクラス内に記述して

usort($arr, $this->cmp)

などとしてみると、

usort() [function.usort]: Invalid comparison function

というエラーが出ます。
同じクラス内に記述した比較関数が見つからなかった、というわけです。


このような場合の解決方法は...
usort($arr, array($this, 'cmp'));
と書き直しましょう。
これで同じクラス内部の関数を呼ぶことが出来ます。


以下は簡単な例です。

class Hoge {
   
    function Hoge() {
       
        /* CodeIgniterの場合 */
        $this->db->select('id, price');
        $this->db->from('ProductMaster');
        $query = $this->db->get();
        $arr = $query->result();
       
        usort($arr, array($this, 'cmp'));
    }
   
    function cmp($a, $b) {
        if ($a->price == $b->price) {
            return 0;
        }
        return ($a->price > $b->price) ? -1 : 1;
    }
}

この例では、CodeIgniterのActiveRecordでSQLを発行して、ProductMasterテーブルから全件取得しています。
返ってくるのはid、priceからなるオブジェクトの配列です。
このオブジェクトの配列をusortする際に、同じクラス内の比較関数をコールしています。

もちろん実際には、この例のような単純な処理の場合は、SQL文にORDER句を追加すべきです。



■参考

PHP: usort - Manual
http://php.net/manual/ja/function.usort.php

Re: [PHP] usort inside a class
http://coding.derkeiler.com/Archive/PHP/php.general/2008-05/msg00374.html
このエントリーをはてなブックマークに追加
posted by taichistereo at 09:26 | Comment(0) | PHP
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
カテゴリクラウド
トップページへ戻る
Blog Widget by LinkWithin