Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态数组_multisort(),而不调用不推荐使用的函数create_function()_Php_Arrays_Sorting_Dynamic_Array Multisort - Fatal编程技术网

Php 动态数组_multisort(),而不调用不推荐使用的函数create_function()

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_函数('$

我的旧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_函数('$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;
}