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 :

supprimer un tableau (array) selon son élément [PHP 5.5]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut supprimer un tableau (array) selon son élément
    Bonjour,
    J'ai un array qui contient plusieurs array.
    Je l'enregistre les valeurs de deux éléments dans MySql :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    $data_json = '{
       "produits": [
          {
             "grams": 0,
             "product_id": 11111,
             "name": "titi",
             "product_exists": true
          },
          {
             "grams": 1000,
             "product_id": 11112,
             "name": "titiqqq",
             "product_exists": true
          },
    	        {
             "grams": 1000,
             "product_id": 11114,
             "name": "toto",
             "product_exists": true
          },
          {
             "grams": 2050,
             "product_id": 11113,
             "name": "tata",
             "product_exists": true
          },
    	  {
             "grams": 1000,
             "product_id": 11162,
             "name": "tataaa",
             "product_exists": true
          },
    	  {
             "grams": 1000,
             "product_id": 11115,
             "name": "tatasss",
             "product_exists": true
          }
       ]
    }';
     
    $data_obj = json_decode($data_json); 
     
    //var_dump ($data_json);
    //print_r ($data_json);
     
    $count = count($data_obj->produits);
    //echo $count;
     
    $i = 0;
    while ($i < $count)
    	{
     
    		foreach ($data_obj->produits as $obj) 
    		{
     
    			$nom_produit = $obj->name;
    			$produit_id = $obj->product_id;
    				//var_dump($obj);
     
    			$stmt = $bdd->prepare("INSERT INTO $tableData	($champ_nom,
    												 $champ_product_id)				
     
    									VALUES (:champ_nom,
    										     :champ_product_id)");
     
    			$stmt->execute(array(':champ_nom'=>$nom_produit,
    							':champ_product_id'=>$produit_id
    							));				
     
     
     
    			$i++;
    		}
     
    	}
    Mais je ne veux pas enregistre les tableaux qui contiennent : "name": "toto" ; "titiqqq" ; "tataaa" et "tatasss"
    Je pensais de mettre un switch mais c'est absurde!
    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
    	$produit_id = $obj->product_id;
    				//var_dump($obj);
     
     
    			$critere_nom = array("titiqqq", "toto", "tataaa", "tatasss",);	
     
    			switch($nom_produit)
    					{							
    						case $critere_nom: 
     
    								// on ne fait rien
     
    						break;
     
    						default:
    							$stmt = $bdd->prepare("INSERT INTO $tableData    ($champ_nom,
    																$champ_product_id)				
     
    							VALUES (:champ_nom,
    								     :champ_product_id)");
     
    							$stmt->execute(array(':champ_nom'=>$nom_produit,
    										       ':champ_product_id'=>$produit_id
    											));								
     
    							break;
    					} 
     
    			$i++;
    Il faut que je supprime les tableaux qui contiennent ces noms. Mais je n'ai pas encore trouvé la solution....

    Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Au lieu d'utiliser un switch, j'utilise if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($obj->name = $critere_nom)
    par contre je ne sais pas ce que je dois mettre dedans :
    si je mets unset, il va supprimer tous les array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if ($obj->name = $critere_nom) 
         {
              unset($obj);
              //var_dump($obj);
              //break;
         }
    Merci

  3. #3
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu n'as pas besoin de supprimer pour ne pas enregistrer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!in_array($obj->name, $critere_nom)) {
         // insert
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Excellent Sabotage,

    Ça marche

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Bonjour,
    Ça marche bien avec la fonction, in_array, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere_nom = array("titiqqq", "toto", "tataaa", "tatasss",);
    Voici le code :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    // (....)
     
    $data_json = '{
       "produits": [
          {
             "grams": 0,
             "product_id": 11111,
             "name": "titi",
             "product_exists": true
          },
          {
             "grams": 1000,
             "product_id": 11112,
             "name": "titiqqq",
             "product_exists": true
          },
    	        {
             "grams": 1000,
             "product_id": 11114,
             "name": "toto",
             "product_exists": true
          },
          {
             "grams": 2050,
             "product_id": 11113,
             "name": "tata",
             "product_exists": true
          },
    	  {
             "grams": 1000,
             "product_id": 11162,
             "name": "tataaa",
             "product_exists": true
          },
    	  {
             "grams": 1000,
             "product_id": 11115,
             "name": "tatasss",
             "product_exists": true
          }
       ]
    }';
     
    $data_obj = json_decode($data_json); 
     
    $count = count($data_obj->produits);
     
    $i = 0;
    while ($i < $count)
    	{
    		foreach ($data_obj->produits as $obj) 
    		{
     
    			$nom_produit = $obj->name;
    			$produit_id = $obj->product_id;
     
    			$critere_nom = array("titiqqq", "toto", "tataaa", "tatasss",);
     
     
    			if (!in_array($obj->name, $critere_nom)) 
    			{
    				$stmt = $bdd->prepare("INSERT INTO $tableData	($champ_nom,
    																 $champ_product_id)				
     
    										VALUES (:champ_nom,
    												:champ_product_id)");
     
    				$stmt->execute(array(':champ_nom'=>$nom_produit,
    									 ':champ_product_id'=>$produit_id
    									));				
     
    			}
     
    			$i++;
    		}
    	}
    J'aimerais bien construire mon array $critere_nom par une requête MySql.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere_nom = array("titiqqq", "toto", "tataaa", "tatasss",);
    Pour obtenir cela je fais une requête :
    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
    try
    	{
    		$query =  'SELECT '. $champ_nom_critere.  '
    				   FROM   '. $tableData_critere . '
    						  ';
     
    		$req = $bdd->prepare($query);
    		$req->execute(array('nom'));
     
    		$critere_nom = $req->fetchAll();
    		//$critere_nom = $req->fetch();		
    	}
    catch(Exception $e) 
    	{
    		throw $e;
    	}
    Mais j'ai une autre difficulté : mon critère ne marche pas. Alors j'ai fait un
    et j'obtiens cela :
    Array
    (
    [0] => Array
    (
    [nom] => titiqqq
    [0] => titiqqq
    )

    [1] => Array
    (
    [nom] => toto
    [0] => toto
    )

    [2] => Array
    (
    [nom] => tataaa
    [0] => tataaa
    )

    [3] => Array
    (
    [nom] => tatasss
    [0] => tatasss
    )

    )
    Comment puis-je changer ma requête pour obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere_nom = array("titiqqq", "toto", "tataaa", "tatasss",);
    et quand je fais print_r($critere_nom);
    Je pense qu'il faut obtenir cela pour que tout marche :
    Array
    (
    [0] => titiqqq
    [1] => toto
    [2] => tataaa
    [3] => tatasss
    )
    J'ai aussi essayé un boucle "foreach " :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach ($critere_nom as $trouver_nom) 
    	{
    		$critere_nom2 = $trouver_nom['nom'];
    	}
    mais, cela ne marche pas puisque j'obtiens par (print_r($critere_nom2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tatassstatassstatassstatassstatassstatasss
    Voici le code :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    // (....)
     
    $data_json = '{
       "produits": [
          {
             "grams": 0,
             "product_id": 11111,
             "name": "titi",
             "product_exists": true
          },
          {
             "grams": 1000,
             "product_id": 11112,
             "name": "titiqqq",
             "product_exists": true
          },
    	        {
             "grams": 1000,
             "product_id": 11114,
             "name": "toto",
             "product_exists": true
          },
          {
             "grams": 2050,
             "product_id": 11113,
             "name": "tata",
             "product_exists": true
          },
    	  {
             "grams": 1000,
             "product_id": 11162,
             "name": "tataaa",
             "product_exists": true
          },
    	  {
             "grams": 1000,
             "product_id": 11115,
             "name": "tatasss",
             "product_exists": true
          }
       ]
    }';
     
    $data_obj = json_decode($data_json); 
     
    $count = count($data_obj->produits);
     
    $i = 0;
    while ($i < $count)
    	{
    		foreach ($data_obj->produits as $obj) 
    		{
    			$nom_produit = $obj->name;
    			$produit_id = $obj->product_id;
     
    				//$critere_nom = array("titiqqq", "toto", "tataaa", "tatasss",);
    			/* construction mon array : $critere_nom   --- */
    			try
    			{
    				$query =  'SELECT '. $champ_nom_critere.  '
    						   FROM   '. $tableData_critere . '
    								  ';
     
    				$req = $bdd->prepare($query);
    				$req->execute(array('nom'));
     
    				$critere_nom = $req->fetchAll();
    				//$critere_nom = $req->fetch();
     
     
    	/*			foreach ($critere_nom as $trouver_nom) 
    					{
    						$critere_nom2 = $trouver_nom['nom'];
     
     
    								//print_r($critere_nom2);      //on obtien :
    								// titiqqqtototataaatatassstitiqqqtototataaatatassstitiqqqtototataaatatassstitiqqqtototataaatatassstitiqqqtototataaatatassstitiqqqtototataaatatasss
     
    					}
     
    					//print_r($critere_nom2);      //on obtien :
    								// tatassstatassstatassstatassstatassstatasss
    	*/							
    			}
    		catch(Exception $e) 
    			{
    				throw $e;
    			}
     
    			if (!in_array($obj->name, $critere_nom)) 
    		  //if (!in_array($obj->name, $critere_nom2)) 
    			{
    				$stmt = $bdd->prepare("INSERT INTO $tableData	($champ_nom,
    																 $champ_product_id)				
     
    										VALUES (:champ_nom,
    												:champ_product_id)");
     
    				$stmt->execute(array(':champ_nom'=>$nom_produit,
    									 ':champ_product_id'=>$produit_id
    									));				
     
    			}				
    			$i++;
    		}
     
    	}
    Comment je peux changer ma 1er requête ($req) ?

    Merci

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Je l'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $critere_nom = $req->fetchAll(PDO::FETCH_COLUMN, 0);
    FETCH_COLUMN :
    Pour retourner un tableau contenant toutes les valeurs d'une seule colonne depuis le jeu de résultats, spécifiez PDO::FETCH_COLUMN. Vous pouvez spécifier quelle colonne vous voulez avec le paramètre column-index.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    et voilà, je ferme ce post...

    Merci encore Sabotage.
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    // (....)
     
    $data_json = '{
       "produits": [
          {
             "grams": 0,
             "product_id": 11111,
             "name": "titi",
             "product_exists": true
          },
          {
             "grams": 1000,
             "product_id": 11112,
             "name": "titiqqq",
             "product_exists": true
          },
    	        {
             "grams": 1000,
             "product_id": 11114,
             "name": "toto",
             "product_exists": true
          },
          {
             "grams": 2050,
             "product_id": 11113,
             "name": "tata",
             "product_exists": true
          },
    	  {
             "grams": 1000,
             "product_id": 11162,
             "name": "tataaa",
             "product_exists": true
          },
    	  {
             "grams": 1000,
             "product_id": 11115,
             "name": "tatasss",
             "product_exists": true
          }
       ]
    }';
     
    $data_obj = json_decode($data_json); 
    $count = count($data_obj->produits);
    $i = 0;
    while ($i < $count)
    	{
    		foreach ($data_obj->produits as $obj)
    		{
    			$nom_produit = $obj->name;
    			$produit_id = $obj->product_id;
     
    //$critere_nom = array("titiqqq", "toto", "tataaa", "tatasss",);
    			/* construction mon array : $critere_nom   --- */
    			try
    				{
    					$query =  'SELECT '. $champ_nom_critere.  '
    							   FROM   '. $tableData_critere . '
    									  ';
     
    					$req = $bdd->prepare($query);
    					$req->execute(array('nom'));
     
    					$critere_nom = $req->fetchAll(PDO::FETCH_COLUMN, 0);
    					//PDOStatement::fetchAll
    					//fetch_style
    					//Pour retourner un tableau contenant toutes les valeurs d'une seule colonne depuis le jeu de résultats, spécifiez PDO::FETCH_COLUMN. Vous pouvez spécifier quelle colonne vous voulez avec le paramètre column-index.
    					//L'exemple suivant montre comment retourner toutes les valeurs d'une seule colonne depuis un jeu de résultats, même si la requête SQL retourne plusieurs colonnes par lignes.
    					//http://php.net/manual/fr/pdostatement.fetchall.php
    				}
    			catch(Exception $e) 
    				{
    					throw $e;
    				}
     
    			// /*  *** */ // in_array — Indique si une valeur appartient à un tableau (ici vient de MySql : $critere_nom 
     
    			if (!in_array($obj->name, $critere_nom))  // selon les cretere on ne les met pas dans mySql
    				{
    					$stmt = $bdd->prepare("INSERT INTO $tableData	($champ_nom,
    																	 $champ_product_id)				
     
    											VALUES (:champ_nom,
    													:champ_product_id)");
     
    					$stmt->execute(array(':champ_nom'=>$nom_produit,
    										 ':champ_product_id'=>$produit_id
    										));				
     
    				}
    			$i++;
    		}
     
    	}

  8. #8
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu t'es perdu dans tes boucles.
    Il faut faire simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // recupère les name à exclure
    $sth = $bdd->prepare('SELECT '. $champ_nom_critere . 'FROM'. $tableData_critere);
    while ($row = $sth->fetch(PDO::FETCH_NUM)) {
        $critere_nom[$row[0]] = TRUE;
    }
     
    // parcoure les produits
    foreach ($data_obj->produits as $obj) {
        if (!isset($critere_nom[$obj->name])) {
              // insert
        }
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Merci Sabotage, c'est vraiement cool

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

Discussions similaires

  1. [Toutes versions] Supprimer un tableau en conservant son contenu
    Par possible924 dans le forum Word
    Réponses: 2
    Dernier message: 16/02/2013, 14h53
  2. Réponses: 15
    Dernier message: 16/09/2009, 16h19
  3. Lier une image selon son nom dans un tableau
    Par Kara dans le forum Word
    Réponses: 17
    Dernier message: 05/12/2008, 12h04
  4. Suppression d'éléments dans un tableau (Array)
    Par jeremie74 dans le forum Flash
    Réponses: 4
    Dernier message: 06/03/2007, 13h54
  5. Réponses: 4
    Dernier message: 09/08/2006, 11h05

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