gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:22:11 24 4
gpt4 key购买 nike

我找到了一些解决我一直遇到的排序问题的方法,但是代码在 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);

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

当然,您可以将其扩展为将映射函数放入映射对象中,因此更直接:
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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com