2009-06-26 8 views
0

Je crée un réseau social personnalisé pour l'un de mes clients.connexion de type LinkedIn connexion requise dans php

Dans ce je stocke les amis d'un utilisateur sous forme de fichier CSV comme indiqué ci-dessous dans le tableau utilisateur

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

Dans le scénario ci-dessus si l'utilisateur connecté est John et s'il visite le profil page de Joey, le lien entre eux doit apparaître comme

John-> Jack-> Gary-> Joey

Je suis en mesure d'établir la connexion au niveau 1 à savoir

Si Jack rend visite le profil de Joey, je suis en mesure d'établir ce qui suit:

Jack-> Gary-> Joey

Mais pour le 2ème niveau je dois entrer dans la même routine pour les boucles que je sais pas la bonne solution + Je ne suis pas capable de l'appliquer aussi.

Alors, quelqu'un peut-il m'aider s'il vous plaît avec ceci?

Merci à l'avance,
Akash

P: SI ne suis pas en mesure de changer l'architecture db :(

+0

Je ne comprends pas, utilisez-vous un RDMBS ou simulez-vous simplement avec un fichier CSV? – wazoox

+2

il utilise un rdbms dont un champ est une chaîne séparée par des virgules représentant un tableau d'uids –

Répondre

0

Voici un code de BFS je l'avais écrit en Ruby, il devrait vous donner un assez bonne idée de la façon dont les choses fonctionnent à traduire en php. l'autre changement que vous aurez besoin de faire est de remplacer le graphique [courant] avec une requête db pour obtenir les amis de l'utilisateur actuel.

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 
0

Voici s un exemple de code:

<?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

Et permettez-moi juste d'ajouter que bien que ce soit "nécessaire", utiliser un CSV pour votre application est une idée TRES MAUVAISE. L'algo que j'ai ici ne prendra que exponentiellement plus longtemps à courir lorsque le nombre d'utilisateurs augmentera (n^3). L'utilisation d'un SGBDR réel améliorera considérablement les performances de votre application. – mattbasta