PHP:如何将usort与匿名函数一起使用?
我有一个数组 我尝试使用这段代码根据主数组中每个元素的字段对主数组进行排序PHP:如何将usort与匿名函数一起使用?,php,arrays,Php,Arrays,我有一个数组 我尝试使用这段代码根据主数组中每个元素的字段对主数组进行排序 $field = $this->sorting; usort($this->out_table["rows"], function($a, $b) use ($field) { return strnatcmp($a[$field], $b[$field]); }); 但我有这个 Parse error: syntax error, unexpected T_FUNCTION 参考第二
$field = $this->sorting;
usort($this->out_table["rows"], function($a, $b) use ($field) {
return strnatcmp($a[$field], $b[$field]);
});
但我有这个
Parse error: syntax error, unexpected T_FUNCTION
参考第二行,以“usort”开头的一行
我错过了什么
我的php版本是
PHP 5.2.4-2ubuntu5.27 with Suhosin-Patch 0.9.6.2 (cli) (built: Mar 11 2013 14:14:48)
在5.30版中引入了匿名函数。你跑得低于5点30分
- 升级您的PHP版本(首先是备份服务器)
- 使用下面的解决方案
PHP5.2不支持匿名函数。匿名函数是
Closure
类的实例,它直到5.3才被引入。。。PS:_升级你的PHP版本,5.2早就过时了
不过,现在最好编写自己的类,将$field
值传递给该类的实例,并使用数组样式的可调用参数:
class Sorter
{
protected $field = null;
public function __construct($field)
{
$this->field = $field;
}
public function sortCallback($a, $b)
{
return strnatcmp($a[$this->field], $b[$this->field]);
}
}
$sorter = new Sorter($field);
usort($this->out_table["rows"], array($sorter, 'sortCallback'));
这基本上就是一个闭包
实例所做的,在这种情况下,匿名函数业务是语法糖。这样一个类的优点是,您可以向它添加更多的排序回调,并将其作为一个带有sortAscending
和sortDescending
回调方法的实用程序类来使用。您可以在实例上设置选项,使分类器在需要时使用严格的(类型和值)比较…这些选项是在PHP5.3中引入的
如果您使用的是旧版本的PHP,则必须使用该函数。它也生成了一个匿名函数,没有功能上的区别,只是语法不太好,而且没有与use
的功能等价:
$field = $this->sorting;
usort(
$this->out_table["rows"],
create_function(
// the list of arguments
'$a, $b',
// the function body (everything you normally put between { and }
'global $field; return strnatcmp($a[$field], $b[$field]);'
)
);
为了避免使用global
(如果将此代码放在函数/方法中,甚至不起作用),可以尝试编写一个函数,将$field
作为参数,并创建比较函数(类似于Javascript闭包)
使用匿名函数很容易做到(但不是必需的),使用create\u function()
也可以轻松做到(不过需要转义):
函数fn()
基本上是以旧的PHP方式(5.3之前)从代码中创建匿名函数
请注意,由于比较函数体是使用参数$fld
的内容生成的,因此对于$fld
的某些值,它可能会产生运行时错误(事实上是编译错误,但由于生成的函数体是在运行时创建和解析的,因此在太晚之前无法检测到)
另一个比
create_function()
更好的选项是为此目的创建一个类,如中所述。您运行的是什么PHP版本?确保它>=5.30
我在问题中添加了pvp版本PHP5.2不支持匿名函数。匿名函数是Closure
类的实例,它直到5.3才被引入。。。PS:_升级你的PHP版本,5.2已经过时了ago@realtebo:放松。。。房屋署是第一个花时间回答这个问题的人,他花时间解释了为什么人们可能也会回答这个问题。不要拿他出气,他只是想帮忙…@realtebo:“最近引入了闭包”。。。PHP5.3已经发布。在此期间,它甚至已经退休了()。我不会说闭包是最近才引入的……也许有点迂腐,但是global$field
实在是太难看了。带有sortAscending
和sortDescending
方法的Sorter
实用程序类可能对opab绝对更有用!事实上,我支持你的答案,并建议不要使用global
+1来对抗匿名否决票,因为这个答案的附加值,我在前面的评论中告诉过你,这个代码甚至因为很多原因都不起作用。其中之一:函数已经由PHP定义,不能再次定义它。然后在usort()
启动之前,仅使用未定义的参数$a
和$b
调用函数一次。它应该是usort($this->out_table[“rows”],'my_sort');函数my_sort(…)
@EliasVanOotegem我是下一个投票人。我在先前的评论中揭露了原因。在您看来,有多少错误应该包含一个有资格投否决票的答案?删除我的答案是因为我更喜欢这种方式。@ʰᵈˑ:你不必删除你的答案。因为有些人可能不愿意实施我建议的修复(不喜欢/不知道/不使用OOP的人确实存在)。对他们来说,因为这在技术上是有效的,所以你的答案很好。尤其是因为,至少对我来说,它证明了OOP=>不必使用global
等的价值……我没有这样想:)就个人而言,我不喜欢global
,希望OP接受这个答案,因为global
带来了潜在的失败。
$field = $this->sorting;
usort(
$this->out_table["rows"],
create_function(
// the list of arguments
'$a, $b',
// the function body (everything you normally put between { and }
'global $field; return strnatcmp($a[$field], $b[$field]);'
)
);
function fn($fld)
{
$fld = addslashes($fld);
return create_function(
'$a, $b', // arguments
"return strnatcmp(\$a['$fld'], \$b['$fld']);" // function body
);
}
usort($this->out_table["rows"], fn($field));