0

こんにちは、私は PHP 開発者の初心者です

このヘルプでソートしようとしましたhttp://www.php.net/manual/en/function.usort.php#103722

function usortByArrayKey($key, $asc=SORT_ASC) {
$sort_flags = array(SORT_ASC, SORT_DESC);

if (!in_array($asc, $sort_flags))
    throw new InvalidArgumentException('sort flag only accepts SORT_ASC or SORT_DESC');

return function(array $a, array $b) use ($key, $asc, $sort_flags) {
            if (!is_array($key)) { //just one key and sort direction
                if (!isset($a[$key]) || !isset($b[$key])) {
                    throw new Exception('attempting to sort on non-existent keys');
                }
                if ($a[$key] == $b[$key])
                    return 0;
                return ($asc == SORT_ASC xor $a[$key] < $b[$key]) ? 1 : -1;
            } else { //using multiple keys for sort and sub-sort
                foreach ($key as $sub_key => $sub_asc) {
                    //array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which
                    if (!in_array($sub_asc, $sort_flags)) {
                        $sub_key = $sub_asc;
                        $sub_asc = $asc;
                    }
                    //just like above, except 'continue' in place of return 0
                    if (!isset($a[$sub_key]) || !isset($b[$sub_key])) {
                        throw new Exception('attempting to sort on non-existent keys');
                    }
                    if ($a[$sub_key] == $b[$sub_key])
                        continue;
                    return ($sub_asc == SORT_ASC xor $a[$sub_key] < $b[$sub_key]) ? 1 : -1;
                }
                return 0;
            }
        };

}

問題は、私はPHP 5.2を使用していて、次のようにコードを変更することです

function usortByArrayKey(&$array, $key, $asc=SORT_ASC) { 
    $sort_flags = array(SORT_ASC, SORT_DESC); 
    if(!in_array($asc, $sort_flags)) {
        throw new InvalidArgumentException('sort flag only accepts SORT_ASC or SORT_DESC'); 
    }
    $cmp = $this->_usortByArrayKey($key, $asc, $sort_flags); 
    usort($array, $cmp); 
    //return $array;
}

function _usortByArrayKey($key, $asc=SORT_ASC, array $sort_flags, array $a, array $b){ 
    if(!is_array($key)) { //just one key and sort direction 
        if(!isset($a[$key]) || !isset($b[$key])) { 
            throw new Exception('attempting to sort on non-existent keys'); 
        } 
        if($a[$key] == $b[$key]) {
            return 0; 
        }
        return ($asc==SORT_ASC xor $a[$key] < $b[$key]) ? 1 : -1; 
    } else { //using multiple keys for sort and sub-sort 
        foreach($key as $sub_key => $sub_asc) { 
            //array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which 
            if(!in_array($sub_asc, $sort_flags)) 
            { 
                $sub_key = $sub_asc; $sub_asc = $asc; 
            } 
            //just like above, except 'continue' in place of return 0 
            if(!isset($a[$sub_key]) || !isset($b[$sub_key])) { 
                throw new Exception('attempting to sort on non-existent keys'); 
            } 
            if($a[$sub_key] == $b[$sub_key]) {
                continue; 
            }
            return ($sub_asc==SORT_ASC xor $a[$sub_key] < $b[$sub_key]) ? 1 : -1; 
        } 
        return 0; 
    } 
}

しかし、私はまだエラーが発生しています

エラー :

Message: Argument 4 passed to ConnectList::_usortByArrayKey() must be an array, none given, called in C:\xampp\htdocs\receiverlist\application\models\connect.php on line 321 and defined
Uncaught exception 'Exception' with message 'attempting to sort on non-existent keys' 
4

3 に答える 3

3

codeigniter で callabck 関数を PHP 関数に入力するには、次のようにする必要があります。

usort($array, array('name-of-controller', 'name-of-method'));

明らかに、必要に応じて名前を置き換えます。

于 2012-04-13T15:10:15.953 に答える
2

あなたはこれを書いています: $cmp = $this->_usortByArrayKey($key, $asc, $sort_flags); しかしあなたの関数_usortByArrayKeyは5つの必須パラメーターを受け入れ、あなたは3つだけを渡します。それが最初のメッセージMessage: Argument 4 passed to ConnectList::_usortByArrayKey() must be an array, none given, called in C:\xampp\htdocs\receiverlist\application\models\connect.php on line 321 and defined が表示される理由です

于 2012-04-13T13:02:28.223 に答える
0

あなたが尋ねる問題は、PHP 5.2 で使用できない無名関数を PHP 5.2 で動作するものに変換する必要があるということです。関数ヘッド:

function(array $a, array $b) use ($key, $asc, $sort_flags)

これはuse句を利用しているため、PHP 5.2 のクラスでこれを模倣する必要があります。以下の単純化された例:

function ($a) use ($b)

クラスは次のようになります。

class Func
{
    private $b;
    public function __construct($b)
    {
        $this->b = $b;
    }
    public function invoke($a) {
        $b = $this->b; # operate on $b, not $this->b
    }
    public function getCallback() {
        return array($this, 'invoke');
    }
}

これはどのように作動しますか?使用例:

$func = new Func($b);
return $func->getCallback();

パターンは何ですか?

  1. 関数を表す新しいクラスを作成します。
  2. use節からの変数は、コンストラクターのパラメーターです。
  3. invoke関数を表す関数を作成します。
  4. 関数内では、invokeすべての使用変数がローカル スコープにコピーされます。
  5. 関数は、getCallback()関数を呼び出すために使用できるコールバックを提供します。
于 2012-04-13T13:04:52.210 に答える