【问题标题】:Sort using "create_function" comparator in PHP prior to 5.3?在 5.3 之前的 PHP 中使用“create_function”比较器进行排序?
【发布时间】:2012-05-31 01:40:24
【问题描述】:

我之前从未在 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

【问题讨论】:

  • 让我们假装create_function 从未存在过...然而,正如所指出的(或发现的?),这是 PHP 5.3+ only 功能。在 PHP 5.2.999 及之前版本中预期会出现语法错误。我希望标题编辑能给这个更多方向。快乐编码:)
  • @pst 如果除了create_function 之外还有更好的方法来定义这个函数 - 我就是不能使用匿名函数
  • stackoverflow.com/questions/10590877/… 它没有显示“闭包”,但是...查看输入如何是字符串。 (我无法想象这在更大范围内会很好,所以也许创建一个类并使用一个方法作为比较器“可调用”?)
  • 以及如何使用(n 对象绑定)方法作为回调:stackoverflow.com/questions/2838197/…
  • "正在运行 "php5" - 我找不到除此之外的任何信息。"您可以通过在命令行上运行php --version 来查找版本。或者在您的 PHP 脚本代码中,输入 phpinfo(); 将打印出大量有关您的 PHP 安装的信息

标签: php sorting anonymous-function


【解决方案1】:

你可以这样做:

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'));

【讨论】:

    【解决方案2】:

    直译(因为你特意要求create_function):

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

    如果你经常运行这个程序要小心,因为每次你调用create_function 它都会添加一个永远不会被破坏的全局函数。如果你这样做太多,它会耗尽内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 2012-09-26
      • 1970-01-01
      • 2014-10-21
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多