IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Mise à jour d'un tableau de liens


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Mise à jour d'un tableau de liens
    bonjour,

    j'ai un probleme:

    j'ai cree un script, pour recuperer dans un fichier des donnees, comprenant entre autre des liens vers d'autres fichiers a analyser.

    j'initialise donc mon tableau avec le nom du premier fichier a analyser, je creer une boucle pour parcourir chaque element du tableau (foreach), et dans cette boucle, je rajoute des elements a mon tableau (elements que je recupere en analysant les fichiers).

    seulement, la boucle ne fonctionne pas: je recupere bien tous les liens vers mes autres fichiers, mais ces fichiers ne sont pas analyses, comme si le foreach faisait une copie prealable de mon tableau avant de commencer son boulot.

    voila le code que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?php
    	$lienList[] = "[rapport][DA]blablabla.txt";
    	$nom_local = "DA.txt";
    	$text = "";
    	$text2 = "";
     
    	foreach ($lienList as $lien) {
    		//lecture du fichier courant
    		$in = fopen($lien, 'r', FALSE);
    		while (!feof($in)) {
    			$text2 = $text2.fread($in, 1024);
    		}
    		fclose($in);
     
    		//ajout des liens du fichier au tableau
    		preg_match_all('/<rapport:>"([^\"]+)"/', $text2, $Resultats , PREG_PATTERN_ORDER);
    		foreach( $Resultats[0] as $Key => $Value ) {
    			if(!in_array($Resultats[1][$Key], $lienList) && substr($Resultats[1][$Key], 0, 13) == "[rapport][DA]") { //on verifie que le fichier n'est pas deja enregistres dans le tableau pour eviter doublons et recursivite
    			echo $Resultats[1][$Key].'<br>';
    				$lienList[]= $Resultats[1][$Key];
    			}
    		}
    		//recuperation et traitement de mes donnees finales seront fait ici
    	}
     
    	//me sert actuellement a verifier que tous les liens du fichier ont ete trouves
    	$filelist = fopen ("liens.txt", 'w');
    	foreach ($lienList as $lien) {
    		fwrite ($filelist, $lien."\n");
    	}
    	fclose ($filelist);
     
    	//sauvegarde des donnees que je veux garder
    	$out = fopen($nom_local, 'w');
    	fwrite($out, $text);
    	fclose($out);
     
    ?>
    la derniere partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	//me sert actuellement a verifier que tous les liens du fichier ont ete trouves
    	$filelist = fopen ("liens.txt", 'w');
    	foreach ($lienList as $lien) {
    		fwrite ($filelist, $lien."\n");
    	}
    	fclose ($filelist);
    me sort le contenu du tableau de liens, et me donne bien tous les liens contenus dans le premier fichier, ce qui montre que mon tableau est bien mis a jour.

    alors ca doit pouvoir marcher si j'encadre ma boucle (le premier foreach) d'un joli "for", mais:
    - je ne serai pas sure que tous mes fichiers soient lus (le "for" c'est pas infini, et il faudra meme le limiter a un nombre assez faible, parce que: )
    - ca engendrerait une charge de calcul supplementaire considerable, puisqu'a chaque iteration de la boucle "for", tous les fichiers deja trouves et analyses seraient a nouveau analyses.

    si quelqu'un a une solution un peu plus elegante que ca a mon probleme, ca m'arrangerait beaucoup.

    merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    bonjour,
    Il y a bien une solution a ton problème, et c'est une technique connue sous le nom de fonction recursive.
    Il s'agit d'une fonction qui s'appelle elle meme, jusqu'a ne plus avoir rien a faire.
    Z.

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par mielikki Voir le message
    seulement, la boucle ne fonctionne pas: je recupere bien tous les liens vers mes autres fichiers, mais ces fichiers ne sont pas analyses, comme si le foreach faisait une copie prealable de mon tableau avant de commencer son boulot.
    c'est exactement ce que fait un foreach :
    A moins que le tableau soit une référence, foreach opère sur une copie du tableau spécifié et non sur le tableau lui-même. foreach affecte le pointeur interne du tableau. Ne l'utilisez pas sans le remettre à zéro avant.
    http://fr.php.net/manual/fr/control-...es.foreach.php

    Donc le plus simple est sans doute d'appliquer le conseil de Zwiter : utiliser une fonction récursive pour parcourir tes fichiers, puis une boucle pour traiter les données. Ce qui donnerait quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function lireFichier($nomFichier)
    {
    	$lienList = array();
    	if (file_exists($nomFichier)
    	{
    		$lienList[] = $nomFichier;
    		$text = file_get_contents($nomFichier);
    		preg_match_all('/<rapport:>"([^\"]+)"/', $text, $Resultats , PREG_PATTERN_ORDER);
    		foreach( $Resultats[0] as $Key => $Value ) {
    			if(!in_array($Resultats[1][$Key], $lienList) && substr($Resultats[1][$Key], 0, 13) == "[rapport][DA]") { //on verifie que le fichier n'est pas deja enregistres dans le tableau pour eviter doublons et recursivite
    			echo $Resultats[1][$Key].'<br>';
    				$lienListe = array_merge($lienListe, lireFichier($Resultats[1][$Key]));
    			}
    		}
    	}
    	return $listListe;
    }
     
    $nomFichier = "[rapport][DA]blablabla.txt";
    $nom_local = "DA.txt";
    $text = "";
    $text2 = "";
     
    $lienList = lireFichier($nomFichier);
     
    foreach ($lienList as $lien) {
    	//recuperation et traitement de mes donnees finales seront fait ici
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    merci pour vos reponses.

    le code que tu m'as fournis celira ne fonctionne pas tout a fait (pour le moment, ca me fait une boucle infinie sur les 4 premiers liens trouves dans le premier fichier), mais je devrais etre capable de me debrouiller a partir de la.

    en tout cas je retiens les fonctions recursives pour l'avenir, ca a l'air vachement utile.
    merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/10/2011, 11h10
  2. [XL-2007] VBA pour automatiser la mise à jour d'un tableau
    Par gdmeunier dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/06/2011, 17h42
  3. [XL-2007] Mise à jour d'un tableau à partir d'un autre tableau générique
    Par NoxfromParis dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/01/2011, 20h40
  4. Réponses: 3
    Dernier message: 23/06/2010, 11h41
  5. mise à jour d'un tableau
    Par pipo159 dans le forum Excel
    Réponses: 17
    Dernier message: 14/03/2008, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo