【发布时间】:2021-04-05 21:54:45
【问题描述】:
我有一个网站在相当旧的 PHP 5.6.38 安装上运行...现在我已经冒险将其移至最新的 XAMPP 版本(使用 PHP 8.0.3)。
不出所料,需要进行一些更改,但我似乎无法排序的是与已弃用的“create_function”函数有关的更改。我用它来允许我通过一个或多个键名对关联数组进行动态排序......例如:
usort($myarray, create_function('$a,$b', get_usort_function('field2 ASC, field5 ASC')));
现在,我读到我应该使用匿名函数,所以将代码更改为如下...
usort($myarray, function($a,$b) { get_usort_function('field2 ASC, field5 ASC'); } );
get_usort_function 用于创建比较所需的文本 - 因此对于上面的示例,它会返回类似...
$field2=compare_ints($a['field2'], $b['field2']); if($field2==0){return compare_ints($a['field5'], $b['field5']);}else{return $field2;}
现在,在 PHP8 版本中,匿名函数不起作用 - 但如果我对 get_usort_function 返回的字符串进行硬编码,那么它确实起作用。我错过了什么吗?
一个简化的例子如下...
<?php
function compare_ints($val1, $val2)
{
return $val1 <=> $val2;
}
function dynamic_create_usort_function()
{
$str='return compare_ints($a[' . "'" . 'id' . "'" . '], $b[' . "'" . 'id' . "'" . ']);';
return $str;
}
$a1 = array( 'id' => 9, 'name' => 'Andy');
$a2 = array( 'id' => 5, 'name' => 'Bob');
$a = array($a1, $a2);
$s = dynamic_create_usort_function();
print "\n\n***$s***\n\n";
print_r($a);
usort($a, function($a,$b) { dynamic_create_usort_function(); } );
print_r($a);
usort($a, function($a,$b) { return compare_ints($a['id'], $b['id']); } );
print_r($a);
?>
上面的例子给出了...的输出
***return compare_ints($a['id'], $b['id']);***
Array
(
[0] => Array
(
[id] => 9
[name] => Andy
)
[1] => Array
(
[id] => 5
[name] => Bob
)
)
Array
(
[0] => Array
(
[id] => 9
[name] => Andy
)
[1] => Array
(
[id] => 5
[name] => Bob
)
)
Array
(
[0] => Array
(
[id] => 5
[name] => Bob
)
[1] => Array
(
[id] => 9
[name] => Andy
)
)
我真的很想解决这个问题,因为我的网站大量使用了这个 usort 功能!所以,很明显,需要最少的返工是梦想......
提前致谢, 达伦
【问题讨论】:
-
如果要动态创建代码,需要使用
eval()。
标签: php