Php 动态数组_multisort(),而不调用不推荐使用的函数create_function()
我的旧php5代码中有此函数,它将接受可变数量的参数,并根据参数执行排序:Php 动态数组_multisort(),而不调用不推荐使用的函数create_function(),php,arrays,sorting,dynamic,array-multisort,Php,Arrays,Sorting,Dynamic,Array Multisort,我的旧php5代码中有此函数,它将接受可变数量的参数,并根据参数执行排序: function array\u alternate\u multisort(){ $arguments=func_get_args(); $arrays=$arguments[0]; 对于($c=(计数($arguments)-1);$c>0;$c--) { if(在数组中($arguments[$c],数组(SORT\u ASC,SORT\u DESC))) { 继续; } $compare=create_函数('$
function array\u alternate\u multisort(){
$arguments=func_get_args();
$arrays=$arguments[0];
对于($c=(计数($arguments)-1);$c>0;$c--)
{
if(在数组中($arguments[$c],数组(SORT\u ASC,SORT\u DESC)))
{
继续;
}
$compare=create_函数('$a,$b','return strcasecmp($a[“.$arguments[$c].'”],$b[“.$arguments[$c].]”);');
usort($arrays,$compare);
if($arguments[$c+1]==SORT_DESC)
{
$arrays=array\u reverse($arrays);
}
}
返回$数组;
}
我这样称呼它:
$alliances = array_alternate_multisort($alliances, "output", SORT_DESC, "score", SORT_DESC);
如何在不调用create\u function()
的情况下将其替换为函数?您可以改用:
未经测试,但应足够接近
use
关键字允许您从函数内的父作用域继承变量。您可以改为使用:
未经测试,但应足够接近
use
关键字允许您从函数内的父作用域继承变量。首先,我认为如果您能够将其硬编码到脚本中:
然后,您可以轻松地完全废弃自定义函数,只需编写以下内容:
代码:()
这将完成您的自定义函数所能完成的所有功能,甚至更多功能,而无需引入任何自定义函数。
这是一种非常简洁、完全本地的、即时可读的技术。这意味着:
- 您不会将脚本仅限于
和SORT_ASC
;对于特定场景,还可以使用其他有用的排序标志SORT_DESC
- 如果希望使用
(默认排序标志),可以选择省略排序方向参数SORT\u ASC
- 与其他本机排序函数一样,可以通过引用修改输入数组
现在,任何超出上述范围的事情都会引入不必要的卷积。为了保持这个假设(我也不赞成)演示的简单性,我坚持认为排序方向标志是必需的,就像在原始代码片段中一样 代码:()
是一种按位奇数校验。如果索引为奇数,则将常数推入&1
中,否则将列数据推入$sortparms
$sortparms
此答案属于一系列类似的答案,这些答案使用splat操作符将参数解压到
数组\u multisort()
调用中
- 您不会将脚本仅限于
和SORT_ASC
;对于特定场景,还可以使用其他有用的排序标志SORT_DESC
- 如果希望使用
(默认排序标志),可以选择省略排序方向参数SORT\u ASC
- 与其他本机排序函数一样,可以通过引用修改输入数组
现在,任何超出上述范围的事情都会引入不必要的卷积。为了保持这个假设(我也不赞成)演示的简单性,我坚持认为排序方向标志是必需的,就像在原始代码片段中一样 代码:()
是一种按位奇数校验。如果索引为奇数,则将常数推入&1
中,否则将列数据推入$sortparms
$sortparms
此答案属于一系列类似的答案,这些答案使用splat操作符将参数解压到
数组\u multisort()
调用中
usort
功能。每次调用callback时,您都会得到两个项目,您需要比较输出
的大小;如果它们是相同的,那么比较得分
等等。我必须说in_array()
检查不是很可靠。如果要对索引数组进行排序,并希望传递第4列的排序规则,则会将其视为sort\u DESC
,并完全跳过该排序规则。另一种逻辑是使用usort
功能。每次调用callback时,您都会得到两个项目,您需要比较输出
的大小;如果它们是相同的,那么比较得分
等等。我必须说in_array()
检查不是很可靠。如果要对索引数组进行排序,并希望传递第4列的排序规则,则会将其视为sort\u DESC
,并完全跳过该排序规则。
$compare = function ($a, $b) use ($arguments, $c) {
return strcasecmp($a[$arguments[$c]], $b[$arguments[$c]]);
};
$alliances = array_alternate_multisort($alliances, "output", SORT_DESC, "score", SORT_DESC);
array_multisort(...[
array_column($alliances, 'output'),
SORT_DESC,
array_column($alliances, 'score'),
SORT_DESC,
&$alliances
]);
function array_alternate_multisort($array, ...$args) {
foreach ($args as $i => $arg) {
$sortParams[] = $i & 1 ? $arg : array_column($array, $arg);
}
$sortParams[] = &$array;
array_multisort(...$sortParams);
return $array;
}