网站线路有个分组功能,即把相关的几个线路放在组里,查看这些线路的详细时,会出现其他的线路。这是个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
拓展思维:
比如人与人之间,一个班(组)的学生,每个学生都参加社团(目的地)。那么其中一个学生的通讯录(同组)上,和他有共同社团爱好的学生,会排在前面。
还有商品~~~也可以用这个思路拓展,上面的结构图依然有效 *_*





