微博控的朋友都知道,会有"可能感兴趣的人"一栏,看到的时候总想着这个怎么写的,今天有空就随便写了下,详见代码:
<?php
/**
* 数据库中得到的关注列表
* $str字符串中,每个逗号分隔的记录表示前者关注后者
*/
$str = "A-B,A-C,A-D,A-E,A-F,A-G,B-C,B-A,B-G,B-I,B-P,B-M,C-A,C-B,C-D,C-G,C-J,C-M";
$arr = explode(',', $str);
/**
* 遍历$arr,找出每个人关注的集合与被关注的集合
* 关注的集合index为att
* 被关注的集合index为bea
*/
$return = array();
foreach($arr as $one){
$relation = explode('-', $one);
$index_1 = $relation['0'];
$index_2 = $relation['1'];
$return[$index_1]['att'][] = $relation['1'];//$index_1 关注了 $relation['1']
$return[$index_2]['bea'][] = $relation['0'];//$index_2 关注了 $relation['0']
}
/**
* 找出A的二度人脉
*/
$A_att = $return['A']['att'];//A的关注集合
$A_era = array();//初始化A的二度人脉数组
foreach($A_att as $p){
if(is_array($return[$p]['att'])){//如果$p有关注集合,则将其att集合合并到A的二度人脉数组中
$A_era = array_merge($A_era, $return[$p]['att']);
}
}
//$A_era = array_unique($A_era);//不去除重复的值,用来计算二度人脉中出现的人在A用户关注的人中有多少人同时关注
$A_era = array_diff($A_era, array('A'));//二度人脉中去除用户自己
?>
衍生出三度、四度人脉算法就不扩展了,如果有不足的地方还请指点。
如有更好方法的朋友恳请分享下。