出题:现有测试数据如下,要求实现如下图中的效果:

array(4) {
  [0] => array(6) {
    ["visit_id"] => int(127)
    ["goods_id"] => int(16)
    ["visittime"] => int(1494399935)
    ["goods_name"] => string(53) "OPPO R9s 全网通4G+64G 双卡双待手机 玫瑰金"
    ["shop_price"] => string(6) "500.00"
  }
  [1] => array(6) {
    ["visit_id"] => int(124)
    ["goods_id"] => int(13)
    ["visittime"] => int(1494399921)
    ["goods_name"] => string(76) "SIEMENS/西门子 KA92NV09TI双开门家用对开门电冰箱变频旗舰款"
    ["shop_price"] => string(7) "4000.00"
  }
  [2] => array(6) {
    ["visit_id"] => int(123)
    ["goods_id"] => int(27)
    ["visittime"] => int(1494399903)
    ["goods_name"] => string(85) "爱他美白金版Aptamil 幼儿配方奶粉3段(12-36个月适用)900g(欧洲进口)"
    ["shop_price"] => string(6) "329.00"
  }
  [3] => array(6) {
    ["visit_id"] => int(120)
    ["goods_id"] => int(26)
    ["visittime"] => int(1494224263)
    ["goods_name"] => string(21) "欢乐谷免票一张"
    ["shop_price"] => string(5) "50.00"
  }
}

还没实现之前我想这个代码不知道要O(n)呢还是更高的复杂度才能实现,细想一下,其实php的数组底层就是哈希实现的,如何简单利用这个特性使复杂度降到O(1)呢?

show me the code

/* 浏览记录按日期分组 */
function groupVisit($visit)
{
    $curyear = date('Y');
    $visit_list = [];
    foreach ($visit as $v) {
        if ($curyear == date('Y', $v['visittime'])) {
            $date = date('m月d日', $v['visittime']);
        } else {
            $date = date('Y年m月d日', $v['visittime']);
        }
        $visit_list[$date][] = $v;
    }
    return $visit_list;
}

说明:入参 $visit 就是上面一开始的测试数据,函数中还对用户体验做了一些优化,比如,你的浏览记录中总是显示出今年的年份,是不是感觉有点冗余,所以如果是本年份的话,年份就要隐藏起来,其他年份还是照样显示出来。不然代码会更加简洁,还是忍不住打出来,如下:

/* 简化版的函数 */
function groupVisit($visit)
{
    $visit_list = [];
    foreach ($visit as $v) {
        $visit_list[date('Y年m月d日', $v['visittime'])][] = $v;
    }
    return $visit_list;
}

好,上面的测试数据经过该函数之后,再把返回值打印出来,有:

array(2) {
  ["05月10日"] => array(3) {
    [0] => array(6) {
      ["visit_id"] => int(127)
      ["goods_id"] => int(16)
      ["visittime"] => int(1494399935)
      ["goods_name"] => string(53) "OPPO R9s 全网通4G+64G 双卡双待手机 玫瑰金"
      ["shop_price"] => string(6) "500.00"
    }
    [1] => array(6) {
      ["visit_id"] => int(124)
      ["goods_id"] => int(13)
      ["visittime"] => int(1494399921)
      ["goods_name"] => string(76) "SIEMENS/西门子 KA92NV09TI双开门家用对开门电冰箱变频旗舰款"
      ["shop_price"] => string(7) "4000.00"
    }
    [2] => array(6) {
      ["visit_id"] => int(123)
      ["goods_id"] => int(27)
      ["visittime"] => int(1494399903)
      ["goods_name"] => string(85) "爱他美白金版Aptamil 幼儿配方奶粉3段(12-36个月适用)900g(欧洲进口)"
      ["shop_price"] => string(6) "329.00"
    }
  }
  ["05月08日"] => array(1) {
    [0] => array(6) {
      ["visit_id"] => int(120)
      ["goods_id"] => int(26)
      ["visittime"] => int(1494224263)
      ["goods_name"] => string(21) "欢乐谷免票一张"
      ["shop_price"] => string(5) "50.00"
    }
  }
}

对的,这正是我想要的效果。

思考:java或C++等其他后台语言要怎么简洁地实现这个效果呢?用map库?python用dictionary?

-end-

php实现‘浏览记录’按日期分组的更多相关文章

  1. SQL Server 根据日期分组、 根据时间段分组(每三个小时一组)

    所用数据表: 一.根据日期分组 1. 使用convert() 函数方式 --根据年月 ),CreatTime,)日期,COUNT(*) 次数,sum(Money)总数 from Orders ),Cr ...

  2. SQL 统计两个表的数据,按同一日期分组

    思路:把两个表的数据按日期整合到临时表在按日期分组,求和. 例子: SELECT t.dateTime AS '日期',SUM(t.money) AS '表1利息',SUM(t.interest) A ...

  3. Cookie实现商品浏览记录--方式二:JS实现

    使用Cookie实现商品浏览记录:方式二:JS方法实现cookie的获取以及写入.当某一个产品被点击时,触发JS方法.利用JS方法判断一下,此产品是否在浏览记录中.如果不存在,则将产品ID加入到coo ...

  4. 使用cookie实现打印浏览记录的功能

    可以用cookie知识来实现打印浏览记录.这里面用到的思路是将浏览记录以字符串的方式保存到cookie中,当浏览记录增加时,再将其转化为数组. $uri=$_SERVER['REQUEST_URI'] ...

  5. (JS实现顾客商品浏览记录以及购物车)Cookie的保存与删除

    //JS实现顾客浏览商品的记录以及实现购物车的功能function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.s ...

  6. Java遇见HTML——JSP篇之商品浏览记录的实现

    一.项目总体介绍 使用Cookie实现商品浏览记录. 要实现这个程序采取的是Model1(Jsp+JavaBean)架构实现,具体步骤: 首先要有个数据库,商品表,操作数据库的一个类DBHelper类 ...

  7. 使用Cookie保存商品浏览记录

    数据流程:页面上是商品列表,点击<a href="productServlet">商品名</a> ==>跳转到自定义的servlet中进行处理,先得到 ...

  8. js记录用户在网站的浏览记录和停留时间

    by weber开发者 from http://weber.pub/ 本文地址: http://weber.pub/js记录用户行为浏览记录和停留时间/163.html 问题 公司想统计一个用户从进入 ...

  9. Cookie中图片的浏览记录与cookie读取servle时路径的设置(文字描述)

    public class ShowServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSer ...

随机推荐

  1. iOS开发之transform

    transform主要应用于动画 1.让一个按钮每次向上移动100的距离 UIButton *head = (UIButton *)[self.view viewWithTag:10]; head.t ...

  2. 开启Tomcat远程调试(转)

    原文链接:http://www.07net01.com/2016/11/1721293.html 如何远程调试tomcat 一,linux环境下 1. 服防火墙打开8000端口,允许外网访问:2. 修 ...

  3. 走入PHP-数据类型和字符串语法

    PHP支持8种原始数据类型 四种标量类型: boolean | integer | float(as double) | string 两种复合类型: array | object 两种特殊类型 re ...

  4. WebStorm里启动electron项目

    WebStorm里启动electron项目,其实很简单 一.第一步打开下面的窗口 二.然后输入electron .,然后敲下 回车键,然后等会项目界面就会出现了. PS:electron 和 点之间有 ...

  5. POPTEST老李分享修改dns ip的vbs代码

    POPTEST老李分享修改dns ip的vbs代码   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  6. 老李分享:MySql的insert语句的性能优化方案

    老李分享:MySql的insert语句的性能优化方案   性能优化一直是测试人员比较感兴趣的内容,poptest在培训学员的时候也加大了性能测试调优的方面的内容,而性能优化需要经验的积累,经验的积累依 ...

  7. 【G】开源的分布式部署解决方案文档 - Web Deploy

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 微软官方部署方式 右键项目->发布 这个大家应该再熟悉不过,在部署前有个预览界面可以看本次更新到底更新哪些文件. 既然它可以预览部署结果, ...

  8. Android系统结构

    从上图中可以看出,Android系统架构为四层结构,从上层到下层分别是应用程序层.应用程序框架层.系统运行库层以及Linux内核层,分别介绍如下: (1)Appliacation Android平台不 ...

  9. 模拟退火算法(SA)求解TSP 问题(C语言实现)

    这篇文章是之前写的智能算法(遗传算法(GA).粒子群算法(PSO))的补充.其实代码我老早之前就写完了,今天恰好重新翻到了,就拿出来给大家分享一下,也当是回顾与总结了. 首先介绍一下模拟退火算法(SA ...

  10. Angular2入门-数据绑定

    ▓▓▓▓▓▓ 大致介绍 Angular2中数据绑定的方式默认是以单向方式,数据绑定的方式可以分为: 1.属性绑定和插值表达式 组件类-> 模板 2.事件绑定:模板 -> 组件类 3.双向绑 ...