我找到了一些解决排序问题的方法,但代码使用了 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/