Listing du fichier matadj.php
00001 <?php
00002 # # (gH) -_- matadj.php ; TimeStamp (unix) : 06 Août 2014 vers 16:06
00003
00004 error_reporting(E_ALL | E_NOTICE ) ;
00005
00006 ###################################################################################
00007 ###################################################################################
00008
00009 echo "\n\nMatrice d'adjacence d'un graphe dont on connait les listes d'adjacence.\n\n" ;
00010
00011 ###################################################################################
00012 ###################################################################################
00013
00014 # aide éventuelle
00015
00016 ###################################################################################
00017
00018 if (!isset($argv[1])) {
00019
00020 echo "\n" ;
00021 echo "syntaxe : php matadj.php fichier_LISTADJ\n" ;
00022 echo "exemple : php matadj.php ladj.txt où le fichier ladj.txt est:\n" ;
00023 echo "\n" ;
00024
00025 echo "html head body \n" ;
00026 echo "head \n" ;
00027 echo "body \n" ;
00028 echo "title \n" ;
00029 echo "\n" ;
00030
00031 echo "Le graphe résultat est visible à l'adresse\n\n" ;
00032 echo " http://forge.info.univ-angers.fr/~gh/Pagsd/xhtml.png\n" ;
00033
00034 echo "\n" ;
00035 exit(-1) ;
00036
00037 } # fin si
00038
00039 ###################################################################################
00040
00041 # lecture du fichier, on en déduit le nombre de sommets
00042
00043 ###################################################################################
00044
00045 $dbg = 1 ; /* mettre 1 pour les cours et pour affichage détaillé */
00046
00047 $nomf = $argv[1] ;
00048 if (!file_exists($nomf)) {
00049 echo "\n" ;
00050 echo "Fichier $nomf non vu. STOP.\n" ;
00051 echo "\n" ;
00052 exit(-1) ;
00053 } # fin si
00054
00055 $nbsom = -1 ; # nombre de sommets
00056 $sommets = array() ; # tableau des noms de sommets
00057 $sommetsi = array() ; # tableau inverse des noms de sommets
00058 $listes = array() ; # tableau des listes d'adjacence
00059 $matadj = array() ; # matrice d'adjacence
00060
00061 $ladj = file_get_contents($nomf) ;
00062
00063 # on découpe suivant \n et on passe en revue les lignes
00064
00065 $tladj = preg_split("/\n/",$ladj) ;
00066
00067 if ($dbg==1) { print_r($tladj) ; } ;
00068
00069 $nbl = 0 ;
00070 foreach ($tladj as $nums=>$liste) {
00071
00072 if ($dbg==1) { echo " $nums => $liste \n" ; } ;
00073 $liste = trim($liste) ;
00074 $nbl++ ;
00075 if ($dbg==1) { echo "\n liste numéro $nbl : $liste\n "; } ;
00076
00077 # traitement de la liste si non vide
00078
00079 if (strlen($liste)>0) {
00080
00081 # on convertit la liste en tableau
00082
00083 $tdm = preg_split("/\s+/",$liste) ;
00084 $noms = $tdm[0] ;
00085
00086 # si le premier sommet (l'origine) n'est pas connu, on l'ajoute
00087
00088 if (!isset($sommetsi[ $noms])) {
00089 $nbsom++ ;
00090 $sommets[$nbsom] = $tdm[0] ;
00091 echo " sommet numéro ".sprintf("%2d",1+$nbsom)." : ".$sommets[$nbsom]."\n" ;
00092 $sommetsi[ $tdm[0] ] = $nbsom ;
00093 $nums = $nbsom ;
00094 $listes[$nums] = array_slice($tdm,1,count($tdm)-1) ;
00095 if ($dbg==1) {
00096 echo " on initialise la liste de $noms en position $nums avec : ".implode(" ",$listes[$nums])."\n" ;
00097 } # fin si debug
00098 } else {
00099 # sinon, on récupère son numéro
00100 $nums = $sommetsi[ $noms ] ;
00101 if ($dbg==1) {
00102 echo " sommet $noms déjà vu, numéro ".sprintf("%2d",1+$nums)."\n" ;
00103 echo " sa liste était ".implode(" ",$listes[$nums])."\n" ;
00104 echo " et il faut ajouter ".implode(" ",array_slice($tdm,1,count($tdm)-1))."\n" ;
00105 } # fin si debug
00106 $listes[$nums] = array_merge($listes[$nums],array_slice($tdm,1,count($tdm)-1)) ;
00107 if ($dbg==1) {
00108 echo " sa liste est donc ".implode(" ",$listes[$nums])."\n" ;
00109 } # fin si debug
00110 } # fin si
00111
00112 # on traite maintenant la liste courante des sommets (destination)
00113
00114 foreach ($listes[$nums] as $num => $sommet) {
00115
00116 # on ajoute un sommet non vu
00117 if (!isset($sommetsi[ $sommet ])) {
00118 $nbsom++ ;
00119 $sommets[$nbsom] = $sommet ;
00120 $sommetsi[$sommet] = $nbsom ;
00121 if ($dbg==1) {
00122 echo " sommet numéro ".sprintf("%2d",1+$nbsom)." : ".$sommets[$nbsom]."\n" ;
00123 } # fin si debug
00124 $listes[$nbsom] = array() ;
00125 } ; # fin si
00126
00127 } # fin pour chaque sommet
00128
00129 } # fin si
00130
00131 } # fin pour chaque liste
00132
00133 if ($dbg==1) { echo " voici les listes " ; print_r($listes) ; } ;
00134
00135 ###################################################################################
00136
00137 # initialisation de la matrice d'adjacence
00138
00139 ###################################################################################
00140
00141 # plus astucieux avec une ligne-tableau recopiée ?
00142
00143 for ($isom=0;$isom<=$nbsom;$isom++) {
00144 $matadj[$isom] = array() ;
00145 for ($jsom=0;$jsom<=$nbsom;$jsom++) {
00146 $matadj[$isom][$jsom] = 0 ;
00147 } # fin pour jsom
00148 } # fin pour isom
00149
00150 ###################################################################################
00151
00152 # remplissage de la matrice d'adjacence
00153
00154 ###################################################################################
00155
00156 for ($isom=0;$isom<=$nbsom;$isom++) {
00157 $liste = $listes[$isom] ;
00158 if ($dbg==1) { echo " sommet $isom : liste => \n" ; print_r($liste) ; } ;
00159 foreach ($liste as $sommet) {
00160 if ($dbg==1) { echo " $isom : $sommet \n" ; } ;
00161 $jsom = $sommetsi[ $sommet ] ;
00162 $matadj[ $isom][ $jsom ] = 1 ;
00163 } # fin pour chaque liste
00164 } # fin pour isom
00165
00166 echo "\nVoici la matrice d'adjacence associée au fichier $nomf :\n\n" ;
00167
00168 echo "num nom " ;
00169 for ($isom=0;$isom<=$nbsom;$isom++) {
00170 echo sprintf("%2d ",1+$isom) ;
00171 } # fin pour isom
00172 echo "\n" ;
00173
00174 for ($isom=0;$isom<=$nbsom;$isom++) {
00175 echo sprintf(" %2d ",1+$isom) ;
00176 echo substr($sommets[$isom]." ",0,7) ;
00177 for ($jsom=0;$jsom<=$nbsom;$jsom++) {
00178 echo " ".$matadj[$isom][$jsom]." " ;
00179 } # fin pour jsom
00180 echo "\n" ;
00181 } # fin pour isom
00182 echo "\n" ;
00183
00184 ###################################################################################
00185
00186 # création du fichier DOT
00187
00188 ###################################################################################
00189
00190 $ftmp = "dot_tmp.gv.txt" ;
00191 $fh = fopen($ftmp,"w") or die(" impossible d'écrire le fichier $ftmp. Stop\n.") ;
00192 fputs($fh,"digraph matrice {\n") ;
00193
00194 for ($isom=0;$isom<=$nbsom;$isom++) {
00195 $liste = $listes[$isom] ;
00196 foreach ($liste as $sommet) {
00197 $lig = " ".utf8_encode($sommets[$isom])." -> ".utf8_encode($sommet)." ;\n" ;
00198 fputs($fh,$lig) ;
00199 if ($dbg==1) { echo $lig ; } ;
00200 } # fin pour chaque sommet
00201 } # fin pour isom
00202
00203 fputs($fh,"}\n") ;
00204 fclose($fh) ;
00205
00206 $fpng = "dot_tmp.gv.png" ;
00207
00208 ###################################################################################
00209
00210 # exécution du fichier DOT
00211
00212 ###################################################################################
00213
00214 if ($dbg==1) { system("cat $ftmp") ; } ;
00215 $cmd = " dot -T png $ftmp -o $fpng " ;
00216 if ($dbg==1) { echo "\n $cmd \n" ; } ;
00217 system($cmd) ;
00218
00219
00220 ###################################################################################
00221
00222 echo "\n\n -- fin normale de matadj.php\n\n" ;
00223 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)