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

PHP & Base de données Discussion :

Dédoublonner un tableau


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    septembre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2011
    Messages : 50
    Points : 30
    Points
    30
    Par défaut Dédoublonner un tableau
    Bonjour,
    Je souhaite supprimer les doublons dans l'affichage de ma variable $code2. Au départ, je la récupère d'une requête (je précise que je ne peux pas faire un distinct dans ma table, je ne peux pas le faire à ce moment là).
    Je récupère les 5 premiers caractères avec la fonction substr, du coup j'obtiens ce code débarrassé des digit supplémentaires 00006 en plusieurs fois normalement selon ce que je récupère dans la table et mon souhait serait de n'afficher qu'un seul 00006 par exemple. Mon code continue de tous me les afficher. Comment puis-je faire pour dédoublonner mon tableau $code2_3 ? Je ne sais pas si je suis parti dans la bonne direction
    Merci pour votre aide
    Code php : 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
    $result = $conn->query($query);
     
    	if($result->num_rows>0){
    		while($row=$result->fetch_assoc()){
     
     
    		// Afficher les 5 premiers caractères
    		$code2 = $row['code'];
    		$code2 = substr($code2,0,5);
     
     
    		$code2_3 = explode(" ",$code2);
     
     
    		$unique = array_unique($code2_3);
    		 var_dump($unique);

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 6 142
    Points : 16 468
    Points
    16 468
    Billets dans le blog
    12
    Par défaut
    salut

    pour dédoublonner un tableau de valeurs, il y a la fonction array_unique()

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 2 254
    Points : 4 892
    Points
    4 892
    Par défaut
    Ta question n'est pas claire du tout: on ne sait pas ce que contient $code2 à l'origine, et comme tu fais un explode dans ton code, on ne sait pas non plus si tu parles de dédoublonner les éléments de $code2_3 après cet explode ou bien si tu veux qu'à chaque tour de ta boucle while tu veux que ton var_dump affiche quelque chose qui n'ait été déjà affiché auparavant.

    Donc donne:
    • des exemples de valeurs de $code2
    • l'affichage actuel (qui ne te satisfait pas)
    • et l'affichage souhaité
    si tu veux être comprise.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    septembre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2011
    Messages : 50
    Points : 30
    Points
    30
    Par défaut
    Merci pour vos réponses. Voici des compléments pour mieux m'expliquer :

    Mon script qui me permet d'afficher l'autocomplétion, je ne souhaite afficher que les 5 premiers digits de mon champ code (ex. une seule fois 00010 au lieu de 00010A, 00010B, 00010C), il s'agit du même produit mais avec des conditionnements différents. Je précise que ma table est une vue d'une table très conséquente de plusieurs millions de produits et je ne peux pas rajouter de colonne dans cette table trop lourde. C'est pourquoi j'aimerai afficher juste les 5 premiers digits du code pour permettre au client de sélectionner son produit et de pouvoir choisir son conditionnement après sur la page résultat où seront afficher les sous-produits ex. : 00010A, 00010B, 00010C).

    J'ai utilisé array_unique mais j'ai toujours 00010 qui s'affichent plusieurs fois :

    exemple de résultat dans l'affichage de l'autocomplétion si on recherche 00010 :
    00010
    gel
    00010
    gel
    00010
    gel

    alors que je souhaiterai avoir :
    00010
    gel



    Code php : 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <?php
    $conn = new mysqli("localhost","root", "","base");
     
    if($conn->connect_error){
    	die("Failed to connect!".$conn->connect_error);
    }
     
     
    if(isset($_POST['query'])){
    	$inpText = $_POST['query'];
     
    	$query = "SELECT *
    		      FROM base_vue
    			  WHERE 
    			  	code LIKE '$inpText%' 
    				OR
    				nom LIKE '%$inpText%'
    			  ORDER BY 
    			  	code limit 15
    			 ";
     
     
    	$result = $conn->query($query);
     
    	if($result->num_rows>0){
    		while($row=$result->fetch_assoc()){
     
    		$result = $conn->query($query);
     
    		if($result->num_rows>0){
    		while($row=$result->fetch_assoc()){
     
    		// Afficher les 5 premiers caractères
    		$code2 = $row['code'];
    		$code2 = substr($code2,0,5);
     
    		$code2_3 = explode(" ",$code2);
     
    		$unique = array_unique($code2_3);
    		var_dump($unique);
     
    		echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$code2."</a>";
    		echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['nom']."</a>";
     
    		}
    	}
    	else {
    	echo "<p class='list-group-item border-1'>No Record</p>";
    	}
    }
    ?>

    Ma table base_vue

    code		nom		cond
    00010A		gel 		250 ml
    00010B		gel		500 ml
    00010C		gel		1 L
    00020A		huile		250 ml
    00020B		huile		500 ml
    00020C		huile		1 L

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 2 254
    Points : 4 892
    Points
    4 892
    Par défaut
    Je précise que ma table est une vue d'une table très conséquente de plusieurs millions de produits et je ne peux pas rajouter de colonne dans cette table trop lourde.
    C'est bien dommage, n'y a t'il pas possibilité de passer outre cette vue qui présentement ne sert pas à grand chose et d'interroger directement une ou plusieurs tables qui respecteraient la première forme normale? (notamment avec les 5 chiffres séparés du reste).

    Sinon, en l'état actuel des choses, (qui, désolé d'insister lourdement, révèle un défaut de conception de la base) tu as deux possibilités: soit tu modifies ta requête en:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT SUBSTR(code, 1, 5) AS C, nom
        FROM base_vue
        WHERE
            code LIKE ? 
                OR
            nom LIKE ?
        ORDER BY code
        LIMIT 15

    (en utilisant une requête préparée comme il se doit et en "bindant" les paramètres.)
    Et là tu obtiens directement les informations nécessaires (c'est à ça que sert une base de données après tout).

    Soit tu fais la manipulation en PHP, ce qui implique de stocker toutes les lignes de résultats dans le même tableau, en ayant tronqué les codes au préalable, pour ensuite (donc en dehors de ta boucle) appliquer array_unique à ce tableau. Pour l'affichage tu devras faire une nouvelle boucle sur ce tableau.

    Je te conseille de reprendre ton code à zéro car il y a beaucoup d'incohérences et de choses à revoir (comme les requêtes qui ne sont pas préparées par exemple ou le mystérieux explode).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    septembre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2011
    Messages : 50
    Points : 30
    Points
    30
    Par défaut
    J'avais fait cette requête avec le distinct bien sûr mais du coup je n'arrive pas à récupérer mon code 00010A complet, je reste sur le 00010. Comment puis-je le conserver pour l'envoyer à ma page résultat ?

    Avec la requête je perd mon code complet, c'est pour ça que je souhaitais faire autrement. Est-ce que c'est possible de me montrer un exemple pour stocker toutes les lignes de résultats dans le même tableau, je ne coince à ce niveau là...
    Merci pour votre aide en attendant

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 2 254
    Points : 4 892
    Points
    4 892
    Par défaut
    Laisse tomber le SUBSTR avec MySQL et envoie tous les résultats en JSON via Ajax. Si tu veux te simplifier la tâche coté Javascript, tu peux éventuellement structurer ton JSON coté PHP de cette manière:
    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
        "00010":[
            {"code":"00010A", "nom":"gel", "cond":"250 ml"},
            {"code":"00010B", "nom":"gel", "cond":"500 ml"},
            {"code":"00010C", "nom":"gel", "cond":"1 L"}
        ],
        "00050":[
            {"code":"00050A", "nom":"gelatine", "cond":"10 feuilles"}
        ]
    }

    Comme ça coté Javascript tu auras aussi bien accès au "code tronqué" via les clefs du json qu'aux codes complets.
    Cela implique de construire ton tableau de résultat avant de le passer à json_encode() de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $produits = [
        "00010" => [
            [ "code" => "00010A", "nom" => "gel", "cond" => "250 ml" ],
            [ "code" => "00010B", "nom" => "gel", "cond" => "500 ml" ],
            [ "code" => "00010C", "nom" => "gel", "cond" => "1 L" ]
        ],
        "00050" => [
            [ "code" => "00050A", "nom" => "gelatine", "cond" => "10 feuilles"]
        ]
    ];
    Donc garde ta requête telle qu'elle était avant et atèle-toi à construire ce tableau à partir des résultats de ta requête.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    septembre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2011
    Messages : 50
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup pour ta réponse. C'est une partie que je ne maîtrise pas du tout mais je vais essayer de voir ce que je peux faire de ce côté...

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    septembre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2011
    Messages : 50
    Points : 30
    Points
    30
    Par défaut
    Voici mon code mais je suis bloqué pour l'affichage du code1_court et unique, j'ai cette erreur :

    Warning: array_unique() expects parameter 1 to be array, string given
    Je ne sais pas trop comment gérer le tableau...

    Merci pour votre aide

    Voici mon code :

    Code php : 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    $conn = new mysqli("localhost","root", "","base");
     
    if($conn->connect_error){
    	die("Failed to connect!".$conn->connect_error);
    }
     
    if(isset($_POST['query'])){
    	$inpText = $_POST['query'];
     
    	$query = "SELECT *
    		      FROM 
    			  	table_vue
    			  WHERE
    			  	code_1 LIKE '%$mot%' 
    				OR
    				code_2 LIKE '%$mot%' 				
    			  ORDER BY
    			  	code_1 limit 15
    			 ";
     
     
    	$result = $conn->query($query);
    	$result2 = array();
     
    	if($result->num_rows>0){
    		while($row=$result->fetch_assoc()){
     
    		$result2[] = $row['code_1'];
    		$result2[] = $row['code_2'];	
     
    		$code_1 = $row['code_1'];
    		$code_2 = $row['code_2'];
     
    		$code_1_court = substr($code_1, 0, 5-strlen($code_1));
     
    		$unique = array_unique($code_1_court);
    		var_dump($unique);	
     
    		echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$code_1_court."</a>";
    		echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$code_2."</a>";
    		}
    	}
    	else {
    	echo "<p class='list-group-item border-1'>No Record</p>";
    	}
    	echo json_encode($result2);
    }
    Et le code sur ma page d'affichage :
    Code javascript : 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
    <script type="text/javascript" src="js/jquery.min.js"></script>
     
    		<script>
    			$.getJSON('page.php', function( data ){
    				//console.log(data);
    				var infos = "";
     
    				$.each(data, function( key, user ){
    					infos += '<tr>\
    						<td> '+ user.code_1 +' </td>\
    						<td> '+ user.code_2 +' </td>\
    					</tr>';
    				});
     
    				$("table#users_info").append(infos);			
    			//console.log(infos);
    			});
    </script>

Discussions similaires

  1. Réponses: 11
    Dernier message: 16/10/2017, 10h40
  2. Dédoublonner un tableau à 2 dimensions
    Par CaviarNAS dans le forum Langage
    Réponses: 3
    Dernier message: 28/06/2011, 18h40
  3. Réponses: 3
    Dernier message: 26/02/2009, 15h08
  4. Réponses: 13
    Dernier message: 30/06/2008, 16h25
  5. Réponses: 4
    Dernier message: 21/04/2008, 10h50

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