5

我以前从未在 PHP 中使用过匿名函数,但我发现了一段代码,它使用一个来对对象进行排序

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

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

此代码将按键对对象进行排序(我传入“turns”)。例如,一个看起来像这样的对象:(用 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

3

你可以这样做:

Class Sorter {
  private $key;

  public function __construct($key) {
    $this->key = $key;
  }

  public function sort($a, $b) {
    return strnatcmp($a[$this->key], $b[$this->key]);
  }
}

usort($numTurnsPerUser, array(new Sorter('key_b'), 'sort'));
于 2012-05-31T01:53:25.413 回答
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 回答