http://habrahabr.ru/blogs/wisdom_of_the_crowds/39506/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
include("config.php");
class relation {
private $_id = 0;
private $_target = 0;
private $_depth = 0;
private $_looked = array();
/*
* @param $id ид пользователя от которого ищем
* @param $target ид друга которого ищем
* @param $depth глубина
*/
function __construct($id, $target, $depth = 10) {
$this->_id = intval($id);
$this->_target = intval($target);
$this->_depth = intval($depth);
}
private function get_friends($ids) {
// убираем элементы которые уже просматривали
$ids = array_diff($ids, $this->_looked);
// если нечего смотреть то и не будем
if(count($ids) == 0) {
return array();
}
$friends = array();
$result = mysql_query('SELECT `myid`, `frid` FROM `friends` WHERE `myid` IN ('.implode(', ', $ids).')');
// ключем являеться друг а значением пользователь.
// так как нам нужна одна цепочка то пользователи перезаписываються
while($row = mysql_fetch_row($result)) {
$friends[$row[1]] = $row[0];
}
mysql_free_result($result);
return $friends;
}
public function get_relation() {
$levels = array(array($this->_id => $this->_id));
for($i = 0; $i < $this->_depth; $i++) {
$last_level = end($levels); // получаем последний уровень
if(array_key_exists($this->_target, $last_level)) {
// цель найдена, получаем цепочку просматривая уровни в обратном порядке
$path = array(); // путь
$key = (string) $this->_target;
while($level = array_pop($levels)) { // раскручиваем цепочку
$path[] = $key;
$key = $level[$key];
}
return array_reverse($path); // вернум перевернутый путь
}
$levels[] = $this->get_friends(array_keys($last_level)); // смотрим глубже
// запоминаем просмотренные элементы для того что бы не попасть в петлю
$this->_looked = array_unique(array_merge($this->_looked, end($levels))); // !!! end($levels) != $last_level
}
return false;
}
}
$rel = new relation(1870960581, 1);
var_dump($rel->get_relation());
?>