如何优化Twitter用户数据统计代码并按重复次数降序排序
嘿,你的代码思路其实挺清晰的,已经能完美实现需求啦!不过确实可以优化得更简洁,排序的问题也很好解决,我来一步步给你拆解:
一、优化数据存储的写法
你原来的逻辑没问题,但可以通过提取重复变量、简化判断逻辑让代码更整洁高效:
$vector = []; foreach($statuses as $status) { // 先把重复调用的对象属性提取成变量,减少重复访问,代码更易读 $screenName = $status->retweeted_status->user->screen_name; $profileImg = str_replace('_normal','_400x400',$status->retweeted_status->user->profile_image_url_https); // 当用户不存在时初始化数据,计数先设为0 if (!isset($vector[$screenName])) { $vector[$screenName] = [ 'img' => $profileImg, 'cont' => 0 ]; } // 统一执行计数累加,避免在分支里重复写赋值逻辑 $vector[$screenName]['cont']++; }
这里有两个小优化点:
- 把重复访问的
$status->retweeted_status->user相关属性提取成变量,减少对象属性的重复调用,既提升可读性,也能稍微提高性能。 - 用
isset()替代array_key_exists(),在这个场景下两者效果一致,但isset()的执行效率更高,因为它会同时检查键存在且值不为null,而我们的场景里只有键不存在时才初始化,完全适用。
二、按出现次数降序排序
要对数组按cont字段从多到少排序,因为我们需要保留用户名作为数组键,所以要用uasort()函数(它会保持数组的关联关系):
PHP7+版本(推荐)
可以用太空船运算符(<=>)来简化排序逻辑,代码非常直观:
uasort($vector, function($a, $b) { // $b在前表示降序,$a在前则是升序 return $b['cont'] <=> $a['cont']; });
PHP5兼容版本
如果你的环境还在使用PHP5,就用传统的比较逻辑:
uasort($vector, function($a, $b) { if ($a['cont'] === $b['cont']) { return 0; } // 返回1表示$a排在$b后面,返回-1则相反,这里实现降序 return $a['cont'] < $b['cont'] ? 1 : -1; });
排序完成后,$vector数组就会按照用户出现次数从多到少排列了。
内容的提问来源于stack exchange,提问作者Sebastian Ospina
相关产品推荐
相关产品推荐

