0

我正在为我的一位客户创建一个自定义社交网络。

在此,我以 CSV 的形式存储用户的朋友,如下面的用户表所示

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

在上述场景中,如果登录用户是 John,并且如果他访问 Joey 的个人资料页面,他们之间的连接应该显示为

约翰->杰克->加里->乔伊

我能够在 1 级建立连接,即

如果杰克访问乔伊的个人资料,我可以确定以下内容:

杰克->加里->乔伊

但是对于第二级,我需要进入相同的 for 循环例程,我知道这不是正确的解决方案 + 我也无法实现它。

那么,有人可以帮我解决这个问题吗?

提前致谢,
阿卡什

P:SI 无法更改数据库架构 :(

4

2 回答 2

0

这是我用 ruby​​ 编写的一些 bfs 代码;它应该让您充分了解如何将其转换为 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
于 2009-06-26T11:01:50.157 回答
0

这是一些示例代码:

<?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";
于 2009-11-22T16:17:47.253 回答