由:我和你的关系有多深?联想到的

网站线路有个分组功能,即把相关的几个线路放在组里,查看这些线路的详细时,会出现其他的线路。这是个Good idea.很多网站都有此功能,比如推荐啊什么的。

现在出现个新问题,同一组的线路比较多,就有相似度高低之分。线路除了分组属性之外,还有个目的地属性,比如这条目的地是哪里的。目的地不止一个。

数据库结构如下:

解决思路:
假设求线路A的同组线路。
找出,线路A同组的线路数组B,线路A目的地数组C。
然后:
循环线路数组{
循环目的地数组{
计算线路数组B每个元素(线路)和线路A有相同数组的个数
}
}
再来个冒泡排序(经典算法)。
//冒泡排序,相同目的地多的排在前面
$c = count($line_array);
for ($i = 0; $i < $c; $i++) {
for ($j = $i; $j < $c; $j++) { //如果前面比后面的大,调换位置 if ($line_array[$i]['count'] > $line_array[$j]['count']) {
$tem = $line_array[$i];
$line_array[$i] = $line_array[$j];
$line_array[$j] = $tem;
}
}
}
本来,PHP有很方便的asort和arsort。但是发现不行,主要是很多时候count都是相同的,没办法存在相同key的数组。于是还是用经典的排序。
最后用array_reverse函数翻转一下即可实现倒序。

分析一下这个算法:
用了两个双层循环,因为一条线路的同组线路不会太多(15以下),一条线路的目的地也不会太多(1-3)。所以还OK了。

实际应用效果如下:
如果是A目的地的线路,则同是A目的地的线路排前面。http://www.zunguiyou.com/lvyou/134.html#tonglei
如果是B目的地的线路,则同是B目的地的线路排前面。http://www.zunguiyou.com/lvyou/44.html#tonglei

拓展思维:
比如人与人之间,一个班(组)的学生,每个学生都参加社团(目的地)。那么其中一个学生的通讯录(同组)上,和他有共同社团爱好的学生,会排在前面。
还有商品~~~也可以用这个思路拓展,上面的结构图依然有效 *_*

携程酒店条件筛选列表分析

最近研究酒店条件筛选,发现一个问题:
比如有个甲酒店,某一天,提供3个房型。分别是:房型A:¥200;房型B:¥300;房型C:¥400.那么在列表里,这个酒店显示的的价格应该是最低价200。
可是如果用户搜索300以上的酒店呢?如果只用这个最低价做判断,显然甲酒店不在列表中。但是这也不合情理,因为甲酒店是有¥300以上的房型的。

看了携程,发现它果然是这么做的,如下图,搜索一个170以上的酒店,那这个最低价161的酒店就被搜索出来,因为它提供了180的房型,符合条件。在这里,它还更体贴用户,只把符合条件的房型显示出来,而不符合条件的房型需要点击“查看全部房型”才显示。

那么猜想它的技术解决方案是这样:
1,搜索房型把符合条件的房型筛选出来
2,把这些房型所属的酒店筛选出来,并去重复

学习携程做酒店星级的“准星”和“挂星”区分

新图乐酒店网上线前,给主管验收。

提出一个需求。酒店分“挂星”和“准星”。其实这是过去的做法,现在因为旅行社法律规范,已经不再使用“准星级”这样带有欺骗性质的词。

而在前台,却是需要做一个筛选。

看看携程的做法:

它把酒店分成:五星级/豪华,四星级/高档,三星级/舒适,二星级及以下/经济

其实豪华,高档这样的词,也就是准星,准星是不出现星星的。挂星才出现星星。如下图。

但是它做筛选的时候,却是有这个条件的。

 

解决方案:

在酒店表中,设置两个字段:

星级:int:这个用在筛选的时候

准星/挂星:tyinint:0:准星,不出现星星,1:出现星星。

 

这又是一个用很简单的技术实现很好用户体验的例子。

更多酒店网站观察与解决方案:

旅游网站分析——携程网酒店地理位置分类的问题

酒店地区与分类数据库结构设计

 

 

ThinkPHP框架,MVC架构,与面向对象的浅思考

用TP也有一段时间了,的确大大提高工作效率。

但是经过一段时间,处理了一些比较复杂的业务逻辑后发现。MVC架构下。网站怎么架构呢?

我们都知道M是模型,V是视图,C是控制器。V是很好理解的,前端的显示页面,HTML代码。M是业务模型。C是连接M和V的控制器,我的理解是类似与转发的机制。

问题来了,既然是转发,那么意味着,控制器的工作应该把前端V的请求使用M对应的功能来解决。工作量应该是最少的。如下图:

mvc

理想的mvc模式

但是实际的情况是:因为种种原因,也许是为了方便,也许因为快速开发,而我发现如果把业务逻辑写在模型上的话。使用ZendStudio或是NetBeans等IED工具,不能直接使用代码提示功能,不能直接“追踪”过去。这是一个很现实的问题,意味着我要必须记得model的所有方法名,否则我要手动打开对应的model文件,寻找对应的方法名。

所以实际项目中,我们是这样架构的:

现实mvc模式

现实mvc模式

把大部分的业务逻辑处理都放在action里,而M只起到了快速操作数据库的功能。

最近看了PHPChina上一篇文章,和我的疑问不谋而合。点击这里查看

我的解决办法是:

文件结构

文件结构

  1. 在控制器中,统一方法前缀。show_:显示页面;action_页面发回去请求;ajax_:页面发回的AJAX请求。如果是业务逻辑比较复杂或需要共用的,独立出一个方法来。用private限定。
  2. 如果是更为复杂的业务逻辑,多个控制器需要用到的,比如订单,用户,登录等。类名用common前缀,这些的“控制器”类并不直接和前端V视图接触。而是提供给其他需要使用相关的类调用。一般用继承方法。可以直接使用。
  3. 但是因为PHP是单继承,这又是一个问题了,如果一个控制器需要订单,用户。那么它只能继承一个类,不能同时继承两个类。这又是一个问题。解决这个问题的办法有两个:1:它继承A,A又继承B。2:或是在控制器里需要用到的时候New 一个控制器类。但是这样的话,又绕回到刚刚不使用model是因为无法追踪类的问题上……