猿问

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

我在旧的 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()?


繁花如伊
浏览 137回答 2
2回答

鸿蒙传说

您可以使用匿名函数来代替:$compare = function ($a, $b) use ($arguments, $c) {    return strcasecmp($a[$arguments[$c]], $b[$arguments[$c]]);};未经测试但应该足够接近该use关键字允许您从函数内的父作用域继承变量。

郎朗坤

首先,我会说,如果您有能力将其硬编码到脚本中:$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_ASC和SORT_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。
随时随地看视频慕课网APP
我要回答