Crew algemeen |
|
Het is waarschijnlijk niet de meest efficiënte manier, maar het werkt wel:
function isConnected($begin, $end) {
$result = mysql_query('SELECT `beginpunt_id`, `eindpunt_id` FROM `verbindingen`');
$data = array();
while ($row = mysql_fetch_row($result)) {
$min = min($row);
$max = max($row);
$data[$min][] = $max;
}
if (isset($data[$begin])) {
$stack[] = $data[$begin];
while (count($stack) > 0) {
$bondings = array_shift($stack);
foreach (array_unique($bondings) as $bonding) {
if ($bonding == $end) {
return true;
} elseif (isset($data[$bonding])) {
$stack[] = $data[$bonding];
}
}
}
}
return false;
}
function isConnected($begin, $end) { $result = mysql_query('SELECT `beginpunt_id`, `eindpunt_id` FROM `verbindingen`'); $data[$min][] = $max; } if (isset($data[$begin])) { $stack[] = $data[$begin]; while (count($stack) > 0) { if ($bonding == $end) { return true; } elseif (isset($data[$bonding])) { $stack[] = $data[$bonding]; } } } } return false; }
Met de volgende tabellen:
CREATE TABLE `punten` (
`id` smallint(6) NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1238 DEFAULT CHARSET=utf8;
CREATE TABLE `verbindingen` (
`id` smallint(6) NOT NULL auto_increment,
`beginpunt_id` smallint(6) default NULL,
`eindpunt_id` smallint(6) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3004 DEFAULT CHARSET=utf8;
CREATE TABLE `punten` ( `id` smallint(6) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1238 DEFAULT CHARSET=utf8; CREATE TABLE `verbindingen` ( `id` smallint(6) NOT NULL AUTO_INCREMENT, `beginpunt_id` smallint(6) DEFAULT NULL, `eindpunt_id` smallint(6) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3004 DEFAULT CHARSET=utf8;
Ik heb de punten 1 tot 1000 in de eerste tabel gezet en random zo'n 4000 verbindingen aangemaakt. Het script draait dan nog niet eens zo heel erg langzaam!
Het beste zou zijn om zoiets in een procedure van mysql te doen, maar dat snap ik nog niet goed genoeg. |