PHP 5.3中按日期字段对三维数组一二层级排序求助
解决方案:PHP 5.3按
latest_user_activity_date排序三维数组 嘿,我懂你现在的困扰——PHP 5.3里要给这种三维数组按latest_user_activity_date字段排序,结果用array_multisort只搞定了第一个admin索引的子数组,对吧?别着急,我给你两种靠谱的解决方案,都是适配PHP 5.3版本的:
方法一:用usort+自定义比较函数(推荐,更直观)
因为你的数组结构是外层为索引(比如admin),每个索引对应一个包含用户数据的子数组,所以我们需要遍历外层数组,对每个子数组单独排序。PHP 5.3支持匿名函数,直接写在usort里很方便:
// 假设你的三维数组变量是$userArrays foreach ($userArrays as &$subArray) { usort($subArray, function($a, $b) { // 将日期字符串转换为时间戳,方便数值比较 $dateA = strtotime($a['latest_user_activity_date']); $dateB = strtotime($b['latest_user_activity_date']); // 升序排序(旧日期在前),如果要降序就返回 $dateB - $dateA return $dateA - $dateB; }); } unset($subArray); // 解除引用,避免后续操作意外修改数组元素
如果你的环境对匿名函数有限制,也可以把比较函数单独提取出来:
// 定义比较函数 function compareActivityDate($a, $b) { $dateA = strtotime($a['latest_user_activity_date']); $dateB = strtotime($b['latest_user_activity_date']); // 升序排序,降序则交换$dateA和$dateB的位置 return $dateA - $dateB; } // 遍历并排序每个子数组 foreach ($userArrays as &$subArray) { usort($subArray, 'compareActivityDate'); } unset($subArray);
方法二:改进array_multisort的用法
如果你更习惯用array_multisort,可以先提取每个子数组里的日期列,再配合原数组排序:
foreach ($userArrays as &$subArray) { // 提取所有用户的活动日期并转为时间戳 $activityDates = array(); foreach ($subArray as $userItem) { $activityDates[] = strtotime($userItem['latest_user_activity_date']); } // 按日期升序排序子数组,SORT_DESC则为降序 array_multisort($activityDates, SORT_ASC, $subArray); } unset($subArray);
额外注意事项:处理无效日期
你的示例里有2000-00-00 00:00:00这种无效日期,strtotime会返回false,可能导致排序异常。可以在比较函数里加入无效日期的处理逻辑,比如把无效日期放在排序结果的最后:
function compareActivityDate($a, $b) { $dateA = strtotime($a['latest_user_activity_date']); $dateB = strtotime($b['latest_user_activity_date']); // 处理两个都是无效日期的情况 if ($dateA === false && $dateB === false) { return 0; } // 把无效日期放在后面(升序场景) if ($dateA === false) { return 1; } if ($dateB === false) { return -1; } return $dateA - $dateB; }
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

