PHP修改代码以避免匿名函数

标签 php anonymous-function

我找到了一些解决排序问题的方法,但代码使用了 PHP 中的匿名函数。我使用的是 5.2.17 版本,我相信匿名函数不受支持。

如何更改以下代码块以便可以在 PHP 5.2.17 中使用它们

$keys = array_flip($order);

usort($items, function($a, $b) use($keys)
{
    return $keys[$a['id']] - $keys[$b['id']];
});

来自PHP sort multidimensional array by other array

还有

$sorted = array_map(function($v) use ($data) {
    return $data[$v - 1];
}, $order);

来自PHP - Sort multi-dimensional array by another array

更新: 问题之一是我不确定变量 $a、$b 和 $v 是如何使用的。所以我不知道如何创建普通函数,从而绕过匿名函数。

最佳答案

两个匿名函数都使用 use 子句将变量传递到本地作用域。

您可以使用对象方法实现相同的目的,其中对象将这些变量作为属性。

在对象方法内,您可以访问它们。

$sorted = array_map(function($v) use ($data) {
    return $data[$v - 1];
}, $order);

示例性映射对象可能如下所示:

class MapObj
{
    private $data;
    public function __construct($data) {
        $this->data = $data;
    }

    public function callback($v) {
        return $this->data[$v - 1];
    }
}

如您所见,它具有相同的功能,但只是用 PHP 5.2 语法编写。

它的用法:

$map = new MapObj($data);
$callback = array($map, 'callback');
$sorted = array_map($callback, $order);

这就是它的工作原理。对象方法的回调始终以具有两个成员的数组形式编写,第一个是对象实例,第二个是对象方法的名称。

当然,您可以扩展它,将映射函数放入映射对象中,这样就更直接了:

class MapObj
{
    ...

    public function map(array $order) {
        $callback = array($this, 'callback');
        return array_map($callback, $order);
    }
}

新用法:

$map = new MapObj($data);
$sorted = $map->map($order);

正如您所看到的,这可能会使用法更加直接。我必须承认,我的方法命名在这里并不是很出色,所以我为您留下了一些改进的空间。

另一个好处是,您可以将回调方法的可见性设置为私有(private)。


将回调中要使用的数据作为参数传递给映射函数的情况。那是因为你写道你已经有了一个想要使用的类,但你不能触及构造函数。所以给出的例子有点短。

这是另一个不使用构造函数的示例,我将其删除:

class MyObj
{
    private $data;

    private function callback($v) {
        return $this->data[$v - 1];
    }

    public function map($order, $data) {
        $callback = array($this, 'callback');
        $this->data = $data;
        return array_map($callback, $order);
    }
}

如您所见,不再需要构造函数来传递 $data,而是将其作为附加参数传递到 map() 方法中。用法:

$myObj = new MyObj(....); // somewhere.

// later on:

$myObj->map($order, $data);

// could be also:

$this->map($order, $data);

如您所见,如何设置私有(private)成员变量取决于您。做适合该工作的事情。

关于PHP修改代码以避免匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13589707/

相关文章:

php - mysql vs mysqli 结果不一样?

php - 解析错误:语法错误,/etc/zabbix/web/zabbix.conf.php中第24行的意外 ';'

C#:匿名方法与命名方法

c# - 为什么不能使用带有动态参数的匿名函数?

r - 在 scale_y_continuous 中使用匿名函数

c# - Moq 具有匿名类型的函数

php - 在 Symfony 中包含用于传播 PDF 生成器包的字体

php - 为什么我的 WordPress functions.php 无法加载样式或脚本?

php - 在数组中格式化日期,内爆并插入数据库