0

I have a situation in which there is an ID which I receive in a function. This ID when I pass to an API it provides me a relation list, for example if I pass as an ID A, I get:

From To Type
A B RelationType1
A C RelationType2
C D RelationType3
D A RelationType4

Now I need to find in a recursive manner the relations for all unique ID I get (A,B,C,D) and for each I need to list down the IDs with types until I cannot find any more relations .

Finally I need to save all this data within the database which is not an issue but it will be a combination of From,To and Type.

This is being attempted in php in which I am working on using a class as the basis to start off, thus implementing DFS to do . Is there a better alternative with efficient calls to the API and faster processing.

Thanks for your help.

rvardhan
  • 1
  • 2
  • Sounds like a good idea. If you have a problem implementing it, then please do share your code, including the actual data structures, expected output and where/what goes wrong. – trincot Oct 13 '21 at 16:16

1 Answers1

0

simple recursive. something like this

basic

class Relations {

   public static function getLinksFromDB(relation_id){
      return $db->array(); // return an array of matches based on the passed in $relation_id from the database, using your normal query here.
   }
   public static function getLinks(relation_id){
       $ret = [];
       $r_ids = Relations::getLinksFromDB(r_id); // when this returns nothing, you will have reached the end of your links, with an exception, if you have any amount which is self contained like A->B, B->C and C->A, then you will have an infinite loop. this could be solved by passing in a counter and once it reaches the counter of depth, just return.
       foreach($r_ids as $r_id){
           $ret[] = Relations::getLinks($r_id);
       }
       return $ret;
   }
}

with depth limitor

class Relations {

   public static function getLinksFromDB(relation_id){
      return $db->array(); // return an array of matches based on the passed in $relation_id from the database, using your normal query here.
   }
   public static function getLinks(relation_id, $counter){
       if($counter <= 0){
          return [];
       }
       $ret = [];
       $r_ids = Relations::getLinksFromDB(r_id);
       foreach($r_ids as $r_id){
           $ret[] = Relations::getLinks($r_id, $counter - 1);
       }
       return $ret;
   }
}

both can be called as such:

$ids = ['A', 'B', 'C'];
$links = [];
foreach($ids as $id){
 $links[] = Relations::getLinks($id);
}

or with the depth limit

$ids = ['A', 'B', 'C'];
$links = [];
foreach($ids as $id){
 $links[] = Relations::getLinks($id, 20);
}
Dean Van Greunen
  • 5,060
  • 2
  • 14
  • 28