为了账号安全,请及时绑定邮箱和手机立即绑定

动态 array_multisort() 而不调用已弃用的函数 create_function()

动态 array_multisort() 而不调用已弃用的函数 create_function()

PHP
繁花如伊 2023-07-01 17:47:18
我在旧的 php5 代码中有这个函数,它将接受可变数量的参数并根据参数执行排序:function array_alternate_multisort(){    $arguments = func_get_args();    $arrays     = $arguments[0];    for ($c = (count($arguments)-1); $c > 0; $c--)    {        if (in_array($arguments[$c], array(SORT_ASC , SORT_DESC)))        {                continue;        }        $compare = create_function('$a,$b','return strcasecmp($a["'.$arguments[$c].'"], $b["'.$arguments[$c].'"]);');        usort($arrays, $compare);        if ($arguments[$c+1] == SORT_DESC)        {                $arrays = array_reverse($arrays);        }    }    return $arrays ;}我这样称呼它:$alliances = array_alternate_multisort($alliances, "output", SORT_DESC, "score", SORT_DESC);如何在不调用的情况下用函数替换它create_function()?
查看完整描述

2 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

您可以使用匿名函数来代替:

$compare = function ($a, $b) use ($arguments, $c) {

    return strcasecmp($a[$arguments[$c]], $b[$arguments[$c]]);

};

未经测试但应该足够接近


该use关键字允许您从函数内的父作用域继承变量。


查看完整回答
反对 回复 2023-07-01
?
郎朗坤

TA贡献1921条经验 获得超9个赞

首先,我会说,如果您有能力将其硬编码到脚本中:

$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

]);

这将完成您的自定义函数将执行的所有操作,甚至更多,而无需引入任何自定义函数。

这是一种非常简洁、完全原生且易于阅读的技术。使用这个意味着:

  • 您不会将脚本限制为仅SORT_ASCSORT_DESC; 对于特定场景,还有其他有用的排序标志。

  • SORT_ASC如果您想使用(默认排序标志),您可以选择省略排序方向参数。

  • 您可以像其他本机排序函数一样通过引用修改输入数组。


现在,超出上述范围的任何内容都会引入不必要的卷积。为了使这个假设(我再次不认可)演示简单,我坚持认为需要排序方向标志,就像原始片段中一样。

代码:(演示

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;

}

  • & 1是按位奇数检查。如果索引为奇数,则将常量压入$sortParams,否则将列数据压入$sortParams


查看完整回答
反对 回复 2023-07-01
  • 2 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信