2016-12-26 86 views
-2

我得到的所有的标签和它的外观像这样:如何在数组中获取结果时按值排序?

"testeng" => 0 
"testeng1" => 5 

所以我想做的事就是为了这个由值,使第一个是这个值为5.任何建议,我怎么能做到这一点?

$tags = ATags::with('articles')->whereHas('language',function($query) use($current_language_id){ 
    $query->where('id','=',$current_language_id); 
})->get(); 
$count_tag = []; 
foreach($tags as $tag){ 
    $count_tag[$tag->name] = $tag->articles->count(); 
} 
+0

你能告诉我你从哪里得到这个 - “”testeng“=> 0,”testeng1“=> 5' ...? –

+0

$ count_tag [$ tag-> name] = $ tag-> articles-> count(); – None

回答

1

您可以使用收集的sortBysortByDesc & count方法,你的结果是这样排序:

$tags = ATags::with('articles')->whereHas('language',function($query) use($current_language_id) { 
    $query->where('id','=',$current_language_id); 
}) 
->get() 
->sortByDesc(function($tag) { // <---- sorting it via article's count 
    return $tag->articles->count(); 
}) 
->take(5); // <----- fetch largest 5 from collection 

您可以通过一个封闭的方法来sortBysortByDesc集合的方法来操作你的结果。

+0

只有一个问题...我可以放置限制,以便只显示5条记录,以便我只显示5条记录数最多的记录? – None

+0

你可以在'get()'方法之前放置限制,像这样 - ' - > limit(5) - > get()'。希望这可以帮助! –

+0

我试过了,但是当我这样做的时候,订单有了变化......我没有得到最大数量的第一个记录 – None

2

您可以使用arsort()为:

arsort($count_tag) 

arsort - 逆向排序数组,并保持索引关系

OR

您可以使用withCount来直接在查询中将结果排序为:

$tags = ATags::with('articles') 
       ->whereHas('language',function($query) use($current_language_id){ 
        $query->where('id','=',$current_language_id); 
       }) 
       ->withCount('articles') 
       ->orderBy('articles_count', 'desc') 
       ->take(5) 
       ->get(); 

从文档

如果您要在不 实际加载它们,你可以使用withCount方法从关系计算结果的数量,这将 地方对你产生的{relation}_count列楷模。

+0

你不觉得,最好使用'ORM orderBy'而不是'arsort()' –

+0

我怎样才能在我的例子中使用这个? – None

+0

只要在'foreach'后执行'arsort($ count_tag)',你的'$ count_tag'就会被更新。 –