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 :

Verifier si il n'y a pas de trou dans une suite de chiffres


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut Verifier si il n'y a pas de trou dans une suite de chiffres
    Bonjour,

    Une nouvelle journée, un nouveau problème :
    Je fais une requete SQL dans ma base qui me revoie des chiffres (ex 1, 8 , 5, 3 ....), mon problème et que je voudrais détecter si il y a des tous entre ces chiffres, avec un exemple ca sera surement plus compréhensif :

    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
    $CodesMoulinsBegin = $bdd->query("SELECT CodeMoulin FROM Moulins WHERE CodeMoulin LIKE '$CodeCommune%'");
    foreach($CodesMoulinsBegin as $Code)
    {
    	$CodeMoulinCommune=substr($Code[CodeMoulin], 4, 8); //on selectionne les caractéres de 4 à 8
    	$LastIdMoulinCommune=$CodeMoulinCommune;  //Je fais ce transfert de variable car aprés mon foreach j'utilise la derniére valeur
    	$LastIdMoulinCommune=(int)$LastIdMoulinCommune //je transforme mon string en int car sinon ca me retourne 001, 002, ...
    	echo "<br>Last:".$LastIdMoulinCommune;    //j'arriche ma valeur pour les debugs 
     
    	//j'essaie de détecter les 'trous' entre mes vlaeurs
    	if ($LastIdMoulinCommune != $bla)
    	{
    		echo "<br>Continu".$LastIdMoulinCommune;
    	}
    	else 
    	{
    		echo "<br>Non continu".$LastIdMoulinCommune;
    	}
    	$bla=$CodeMoulinCommune+1;
    }
    Ce qui me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Last:5
    Continu5
    Last:1
    Continu1
    Last:2
    Non continu2
    Comme on peut le remarquer, 1, 2 et 5 existent, et je voudrais que ça me détecte qu'il manque 3 et 4.
    Étant donné que dans ma BDD 5 apparait avant 1 mon if ne fonctionne pas.

    Comment pourrais-je faire pour détecter ces nombres ?

    Merci par avance.

    Cordialement.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pour bien te répondre il faudrait que tu nous dises pourquoi tu veux faire ça et que tu nous en dises un peu plus sur la construction de "CodeMoulinCommune"
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut
    Bonjour,

    En fait je fais un logiciel, pour inventorier les moulins (à eau) pour mon asso.

    Chaque moulin à eau je lui génére un Code Moulin, ce code moulin est composé de : code commune (4 chiffres) + code moulin composé de 3 chiffres.
    CodeMoulinCommune => codecommune + codemoulin donc 4+3 = 7 chiffres c'est pour cela que je récupére que les chiffres de 4 à 8 pour n'avoir que le codemoulin
    $LastIdMoulinCommune = 3 chiffres
    $Code['CodeMoulin'] = 7 chiffres (4 + 3)

    Je veux que par exemple si ne supprime un moulin lié à une commune, cela va me créer un 'trou' dans mes valeurs. Ex si je créé pour la commune 0001 un moulin avec comme code moulin 001 (donc 0001001) et un autre avec 002 (donc 0001002) comme code moulin, puis que je supprime le moulin 001 alors, je veux que si je rajoute un nouveau moulin sur la commune 0001 que le code moulin à affecter soit 001 (donc 0001001) et non pas 003 (0001003).

    Je suis sur une piste en ce moment, je charge dans un tableau mes valeurs de mes codes moulin (3chiffres) puis je les tri par ordre croissant mais il faut que je trouve moyen pour vérifier si les chiffres se suivent...et si ce n'est pas le cas, de récupérer ces valeurs.

    Voilà au point où j'en suis pour le moment :

    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
    //On sélectionne la list des moulins qui commencent par le code commune
    $CodesMoulinsBegin = $bdd->query("SELECT CodeMoulin FROM Moulins WHERE CodeMoulin LIKE '$CodeCommune%'");
    foreach($CodesMoulinsBegin as $Code)
    {
    	$CodeMoulinCommune=substr($Code[CodeMoulin], 4, 8); //on selectionne les caractéres de 4 à 8
    	$LastIdMoulinCommune=$CodeMoulinCommune;
    	$LastIdMoulinCommune=(int)$LastIdMoulinCommune;
    	$tab[$i] = $LastIdMoulinCommune; //j’insère les valeurs dans un tableau
    	$i++;
    }
    //On classe les valeurs du tableau par odre croissant
    asort($tab);
     
     
    foreach($tab as $Value)
    {
       //Il faut vérifier si mes valeurs du tableau se suivent....:aie:
    }
     
    print_r ($tab);
    Donc moi je veux juste m’intéresser à la continuité sur mon code moulin (3 chiffres) vérifier qu'il n'y ai pas de trou et si il y en a que je puisse récupérer ces valeurs.

    En espérant avoir été clair dans mes explications .

    Edit, i lfaut se focaliser sur la variable $LastIdMoulinCommune étant donné que ca me retourne bien les valeurs sur 3 chiffres et que mon tableau se remplit bien comme il faut.

  4. #4
    Membre averti
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut
    Rebonjour,

    J'ai réussi à faire ce que je voulais finalement :

    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
    //On slectionne la list des moulins qui commencent par le code commune
    $CodesMoulinsBegin = $bdd->query("SELECT CodeMoulin FROM Moulins WHERE CodeMoulin LIKE '$CodeCommune%'");
    foreach($CodesMoulinsBegin as $Code)
    {
    	$CodeMoulinCommune=substr($Code[CodeMoulin], 4, 8); //on selectionne les caractéres de 4 à 8
    	$LastIdMoulinCommune=$CodeMoulinCommune;
    	$LastIdMoulinCommune=(int)$LastIdMoulinCommune;
    	//echo "<br>Last:".$LastIdMoulinCommune;
    	//echo "<br>i:".$i;
    	$LoadCodeCommuneTab[$i] = $LastIdMoulinCommune;
    	$i++;
    }
    //On classe les valeurs du tableau par odre croissant
    asort($LoadCodeCommuneTab);
     
    //Creation du tableau qui va contenir les valeurs libre (trous)
    $FreeValuesCodeMoulinTab = array();
    $ValueToCompare=0;
    $i=0;
    foreach($LoadCodeCommuneTab as $Value)
    {
    	$ValueToCompare++;
    	if ($Value == $ValueToCompare)
    	{
    		echo "<br>Continu".$Value.$ValueToCompare;
    	}
    	else 
    	{
    		echo "<br>Non continu".$Value.$ValueToCompare;
    		$FreeValuesCodeMoulinTab[$i]=$Value;
    	}
    }
    print_r($FreeValuesCodeMoulinTab);
    Mais il reste le probléme que si il n'y a pas de code moulin qui commence par 1 (0001001) mais que le premier codemoulin d'une commune commence par 3 par exemple (0001003) alors voici le résultat de mon tableau :
    Non continu31
    Array ( [0] => 3 )

    comme vous pouvez le voir j'aurais voulu que ca me retourne 1 et 2 dans mon tableau au lieu de 3.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Je n'ai pas testé mais ça devrait fonctionner tout simplement comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $code = 1;
    $result = $bdd->query("SELECT CodeMoulin FROM Moulins WHERE CodeMoulin LIKE '$CodeCommune%' ORDER BY CodeMoulin ASC");
    foreach($result as $row) {
        $CodeMoulinCommune = (int) substr($row[CodeMoulin], 4, 8); //on selectionne les caractéres de 4 à 8
        if ($CodeMoulinCommune != $code) {
             break;
        }
        $code++;
    }
    echo 'code dispo : ' . $code;
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. pas de constructeur dans une classe
    Par womannosky dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2008, 10h16
  2. Réponses: 2
    Dernier message: 12/06/2008, 11h53
  3. Réponses: 2
    Dernier message: 28/10/2007, 17h46
  4. Champ pas toujours renseigné dans une table
    Par Boubas1 dans le forum Modélisation
    Réponses: 1
    Dernier message: 12/05/2007, 06h57
  5. j'arrive pas a inserer dans une table vide
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 16
    Dernier message: 03/05/2005, 14h24

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