我在旧的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()
的情况下将其替换为函数?
答案 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_ASC
和SORT_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()
调用中。