5

PHP で無名関数を使用したことはありませんが、オブジェクトをソートするために無名関数を使用するコードを見つけました。

usort($numTurnsPerUser,build_sorter('turns'));

function build_sorter($key) {
    return function ($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
}

このコードは、オブジェクトをキーでソートします (「ターン」を渡します)。たとえば、次のようなオブジェクト: (読みやすくするために JSON で記述されています)

$numTurnsPerUser = {
    "31":{
        "turns":15,
        "order":0
    }, "36":{
        "turns":12, 
        "order":1
    }, "37":{
        "turns":14, 
        "order":2
    }
}

次のようなオブジェクトにソートされます。

$numTurnsPerUser = {
    "36":{
        "turns":12,
        "order":1
    }, "37":{
        "turns":14,
        "order":2
    }, "31":{
        "turns":15, 
        "order":0
    }
}

これは、PHP 5.3.0 を実行しているローカル サーバーではうまく機能しましたが、「php5」を実行しているオンライン サーバーでは機能しません。それ以外の情報を見つけることができません。エラーが発生します

解析エラー: 構文エラー、予期しない T_FUNCTION

PHP < 5.3 では無名関数を使用できず、create_function を使用する必要があると読みましたが、無名関数の「使用」部分に困惑しました。誰かが関数の「使用」部分が何であるか、またはさらに良いことに、これを必要な create_function パラメータに「変換」する方法を説明してもらえますか?

4

2 に答える 2

0

直訳(あなたが具体的に求めたのでcreate_function):

function build_sorter($key) {
    return create_function('$a, $b', '$key = '.var_export($key, true).';
        return strnatcmp($a[$key], $b[$key]);
    ');
}

これを頻繁に実行する場合は注意してください。これを呼び出すたびに、create_function破棄されることのないグローバル関数が追加されるからです。これをやりすぎると、メモリが不足します。

于 2012-05-31T17:26:18.943 に答える