Требуется соединение с друзьями типа LinkedIn в php - PullRequest
0 голосов
/ 26 июня 2009

Я создаю собственную социальную сеть для одного из моих клиентов.

Здесь я храню друзей пользователя в форме CSV, как показано ниже в таблице пользователей

uid    user_name      friends
1      John           2
2      Jack           3,1
3      Gary           2,4
4      Joey           3

В приведенном выше сценарии, если вошедшим в систему пользователем является Джон и если он посещает страницу профиля Joey, соединение между ними должно выглядеть как

Джон-> Jack-> Gary-> Joey

Я могу установить соединение на уровне 1, т.е.

Если Джек посещает профиль Джои, я могу установить следующее:

Jack-> Gary-> Joey

Но для 2-го уровня мне нужно войти в ту же самую процедуру для циклов, которая, как я знаю, не является правильным решением + Я также не могу реализовать это.

Итак, кто-то может помочь мне с этим?

Заранее спасибо,
Акаша

P: S Я не в состоянии изменить архитектуру БД: (

Ответы [ 2 ]

0 голосов
/ 22 ноября 2009

Вот пример кода:

<?php

$currentUID = 1; // The logged in user
$pageUID = 4; // The user whose page is being visited

// Parse the CSV
$csv = explode("\n", $csvData);
$csvlen = count($csv);
for($i=0;$i<$csvlen;$i++) {
    $csv[$i] = explode(",", $csv[$i]);
}

function getFriends($csv, $uid) {
    foreach($csv as $user)
        if($user[0] == $uid)
            return explode(',', $user[2]);
}

$userFriends = getFriends($csv, $currentUID);
$pageFriends = getFriends($csv, $pageUID);

$friendPool = array();
foreach($userFriends as $friend) {
    $hisFriends = getFriends($friend);
    foreach($hisFriends as $subFriend) {
        if(in_array($subFriend, $pageFriends)) {
            if(isset($friendPool[$friend]))
                $friendPool[$friend][] = $subFriend;
            else
                $friendPool[$friend] = array( $subFriend );
        }
    }
}

foreach($friendPool as $friend=>$subFriends)
    foreach($subFriends as $subFriend)
        echo "$currentUID -> $friend -> $subFriend -> $pageUID\n";
0 голосов
/ 26 июня 2009

Вот код BFS, который я написал в ruby; это должно дать вам достаточно хорошее представление о том, как все работает, чтобы перевести его на php. другое изменение, которое вам нужно сделать, это заменить graph [current] на запрос db для получения друзей текущего пользователя.

def bfs(graph, start, stop)
  queue = [start]
  visited = {}
  parents = {}
  current = nil
  while true
    if queue.empty?
      return nil
    end
    current = queue.shift
    if current == stop
      return read_path(current, parents)
    end
    visited[current] = true
    graph[current].each do |i|
      if not visited[i] and not queue.index(i)
        parents[i] = current
        queue.push(i)
      end
    end
  end
end

def read_path(node, parents)
  a = [node]
  while parents[node]
    a.push(parents[node])
    node = parents[node]
  end
  return a.reverse
end

GRAPH = {
  "a" => ["b", "c"], 
  "b" => ["c", "d"],
  "c" => ["a", "e"],
  "d" => ["b", "c", "f"],
  "e" => ["c", "f"]
}

path = bfs(GRAPH, "a", "f")
p path
...