动态array_multisort()而不调用不推荐使用的函数create_function()

时间:2020-06-28 10:56:59

标签: php arrays sorting dynamic array-multisort

我在旧的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 个答案:

答案 0 :(得分:1)

您可以改用anonymous function

public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view;

    LayoutInflater inflater = LayoutInflater.from( mContext );
    view= inflater.inflate( R.layout.card_view_item,parent,false );

    return new MyViewHolder( view );
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    final Upload upload = uploads.get( position );
    holder.tv_book_title.setText( upload.getName() );
    Glide.with( mContext ).load( upload.getUrl() ).into( holder.imd_book_title );


}

@Override
public int getItemCount() {
    return uploads.size();
}

未经测试,但应该足够接近

通过$compare = function ($a, $b) use ($arguments, $c) { return strcasecmp($a[$arguments[$c]], $b[$arguments[$c]]); }; 关键字,您可以从函数内部的父作用域继承变量。

答案 1 :(得分:1)

首先,我认为如果您有能力将其硬编码到脚本中

$alliances = array_alternate_multisort($alliances, "output", SORT_DESC, "score", SORT_DESC);

然后,您可以轻松完全废弃您的自定义功能,并编写以下代码:

代码:(Demo

array_multisort(...[
    array_column($alliances, 'output'),
    SORT_DESC,
    array_column($alliances, 'score'),
    SORT_DESC,
    &$alliances
]);

这将完成您自定义函数的所有工作,并且在不引入任何自定义函数的情况下完成更多工作。

这是一种非常简洁,完全本地化且即时可读的技术。使用此表示:

  • 您不会将脚本限制为仅SORT_ASCSORT_DESC;在特定情况下还可以使用其他有用的排序标志。
  • 如果您想使用SORT_ASC(默认的排序标志),则可以选择省略排序方向参数。
  • 您可以像其他本地排序功能一样通过引用来修改输入数组。

现在,除了上述内容之外的任何内容都会引入不必要的卷积。为了使这个假设(同样,我不认可)的演示变得简单,我坚持要求像您的原始代码片段一样要求排序方向标记。

代码:(Demo

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

此答案属于一系列类似的答案,这些答案使用splat运算符将参数解包到array_multisort()调用中。