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 des éléments de tableau


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut Supprimer des éléments de tableau
    Bonjour, je souhaite supprimer un ou plusieurs éléments de tableau mais je ne sais pas si ma méthode est très optimisé.

    Cette fonction ne supprime qu'un seul élément à la fois, je me suis dit que peut être pourrais utiliser un système pour les exclusions avec un autre tableau.
    Mais au niveau performance sa me semble pas génial:

    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
    private function array_delete_key($array,$search) {
    		$temp = array();
    		foreach($array as $key => $value) {
    			 if($key!=$search) {
    			 	$temp[$key] = $value;
    			 }
    		}
    		return $temp;
    	}
    	public function tabs_encode($params,$exclude=''){
    		if(is_array($params)){
    			foreach ($params as $key=>$value){
    				if($exclude != ''){
    					$tabs = $this->array_delete_key($value, $exclude);
    				}else{
    					$tabs = $value;
    				}
    				$result[]=$tabs;
    			}
    			return $result;
    		}
    	}
    N'y aurai-t-il pas une méthode plus propre mais qui supprime autant d'élément que je le souhaite ?
    Je me demande aussi si c'est possible de transformer un élément de tableau avant de le renvoyer ?
    par exemple un des éléments est un énorme texte et je dois appliquer une fonction pour simplement retourner un oui ou non à la place de celui-ci.
    Donc supposons que je souhaite purement et simplement le remplacer par autre chose sans pour autant toucher au reste

  2. #2
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    salut,

    tu peux faire un test avec isset ensuite faire un unset.

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    N'y aurai-t-il pas une méthode plus propre mais qui supprime autant d'élément que je le souhaite ?
    Cette méthode est selon moi la plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function delete_value_from_array (array &$arr, $value = false, $strict = false) {
      $c = 0;
      foreach (array_keys($arr, $value, $strict) as $key) {
         $c++;
         unset($arr[$key]);
      }
      return $c;
    }
     
    $a = array(1,1,1,1,1,2,1,1,1,3);
    var_dump(delete_value_from_array($a, 1));
    var_dump($a);
    On peut légèrement la modifier pour accepter un tableau de valeurs à supprimer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function delete_values_from_array (array &$arr, array $values) {
      $c = 0;
      foreach (array_intersect($arr, $values) as $key => $value) {
         $c++;
         unset($arr[$key]);
      }
      return $c;
    }
     
    $a = array(1,1,1,1,1,2,1,1,1,3);
    var_dump(delete_value_from_array($a, array(1,2)));
    var_dump($a);
    Pour info, si on connait les clés, le moyen le plus rapide pour supprimer une (ou plusieurs) entrées est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($arr[$key])) unset($arr[$key]);
    Si tu veux faire des remplacements à la volée, regarde du coté de array_map ou array_walk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $a = array(1,2,3,4,5,6,7,8,9);
     
    // Remplaçons les nombres paires par 'oui' et impaires par 'non'
    array_walk($a, function (&$item, $key) {
      $item = ($item %2 == 0) ? 'Oui' : 'Non';
    });
     
    var_dump($a);

  4. #4
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message

    Pour info, si on connait les clés, le moyen le plus rapide pour supprimer une (ou plusieurs) entrées est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($arr[$key])) unset($arr[$key]);
    Le seul point négatif avec isset c'est au niveau des éléments avec des valeurs NULL qui retourne false. Dans ce cas il vaut mieux utiliser array_key_exists. Si tu es sûre que ton tableau ne stockera pas des valeurs NULL tu ferais mieux d'utiliser isset vu qu'elle est plus rapide.

  5. #5
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Bonjour et merci, je suis entrain de tester mais malheureusement cela ne fonctionne pas.
    J'utilise des clés sous forme de chaine et en essayant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function delete_values_from_array (array &$arr, array $values) {
      $c = 0;
      foreach (array_intersect($arr, $values) as $key => $value) {
         $c++;
         unset($arr[$key]);
      }
      return $c;
    }
     
    $a = array(1,1,1,1,1,2,1,1,1,3);
    var_dump(delete_value_from_array($a, array(1,2)));
    var_dump($a);
    Il ne me retourne que des 0
    Mon tableau ressemble à ceci :
    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
     
    Array
    (
        [0] => Array
            (
                [idnews] => 2
                [keynews] => C4uIsrvvpyBGn7BYtyve
                [n_title] => le truc du mois
                [n_content] =>  elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
                [idlang] => 1
                [n_image] => 1fhdkj1dfycks00k004.jpg
                [date_register] => 2011-06-09 12:06:17
                [date_publish] => 0000-00-00 00:00:00
                [published] => 0
                [iso] => fr
            )
     
        [1] => Array
            (
                [idnews] => 1
                [keynews] => kjuAX7Vb3o3XbkjlbpSS
                [n_title] => pirate des caraïbes 4 enfin sorti
                [n_content] => Lorem ipsum dolor
                [idlang] => 1
                [n_image] => piny9upl8u808s0wo.png
                [date_register] => 2011-06-09 10:40:06
                [date_publish] => 2011-06-09 13:46:14
                [published] => 1
                [iso] => fr
            )
     
    )
    Ce que je souhaite c'est par exemple supprimer la clé n_content mais continuer de retourner le reste.
    Dans une évolution je dois également être capable de modifier cette entrée donc par exemple pour le moment n_content est une chaine mais je souhaite pourquoi pas la remplacer par null ou pas null.
    une idée ?

    Voici les fonctions vous allez imaginer directement ce que je tente de faire:

    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
     
    private function array_delete_key($array,$search,$debug) {
    		//$temp = array();
    		foreach($array as $key) {
    			/*if($key!=$search) {
    		 		$temp[$key] = $value;
    			}*/
    			unset($array[$search]);
    		}
    		return $array;
    	}
    	public function tabs_json_encode($params,$exclude='',$debug=false){
    		if(is_array($params)){
    			$result = array();
    			foreach ($params as $key){
    				if($debug!=false){
    					$firebug = new magixcjquery_debug_magixfire();
    					$firebug->magixFireDump('Dump json encode', $params);
    				}
    				if($exclude != ''){
    					$tabs = $this->array_delete_key($key, $exclude,$debug);
    				}else{
    					$tabs = $key;
    				}
    				$result[]= json_encode($tabs);
    			}
    			$this->stack_error();
    			return $result;
    		}
    	}
    En faites mon système va me permettre de travailler pour avoir un format json en retour, donc si je travail correctement sur les tableaux avant l'encodage, je pense avoir quelque chose de déjà pas mal

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Bon, vu que tu n'a pas l'air d'avoir compris mon post je vais me répéter:
    Pour info, si on connait les clés, le moyen le plus rapide pour supprimer une (ou plusieurs) entrées est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($arr[$key])) unset($arr[$key]);
    Ce que je souhaite c'est par exemple supprimer la clé n_content mais continuer de retourner le reste.
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach ($arr as $key => $subarr) {
      if (isset($subarr['n_content'])) {
        unset($arr[$key]['n_content']);
    }
    Note que je ne comprends toujours pas où est la difficulté...

  7. #7
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Je le comprend bien, je ne suis peut être pas bien éveillé
    J'ai essayer ceci :
    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
     
    public function tabs_json_encode($params,$arg=array('item'=>'','action'=>'','replace'=>array(1,0)),$debug=false){
    		if(is_array($params)){
    			$firebug = new magixcjquery_debug_magixfire();
    			if($debug!=false){
    				$firebug->magixFireDump('Dump json encode', $params);
    			}
    			foreach($params as $key => $val) {
    				if($arg['action'] != ''){
    					switch($arg['action']){
    						case 'delete':
    							if (isset($val[$arg['item']])) {
    								unset($params[$key][$arg['item']]);
    							}
    						break; 
    						case 'replace':
    							if (isset($val[$arg['item']])) {
    								if($params[$key][$arg['item']] != null){
    									$params[$key][$arg['item']] = $arg['replace'][0];
    								}else{
    									$params[$key][$arg['item']] = $arg['replace'][1];
    								}
    							}
    						break;
    					}
    				}
    				$tabs = $params[$key];
    				$result[]= json_encode($tabs);
    			}
    			$this->stack_error();
    			return $result;
    		}else{
    			throw new Exception('tabs json is not array :'.$params);
    		}
    	}
    Ceci fonctionne bien pour une seule valeur mais pas pour un tableau de valeur (en chaine).
    mon tableau est assez particulier sachant qu'ensuite il faut que je puisse y caser un replace ou str_replace

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/03/2011, 16h25
  2. [Tableaux] Insérer des éléments à un tableau
    Par richard038 dans le forum Langage
    Réponses: 5
    Dernier message: 11/05/2006, 22h02
  3. Supprimer des éléments dans une TreeView ?
    Par souch dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/09/2005, 12h20
  4. Supprimé des éléments vide d'un tableau
    Par shinux2004 dans le forum Langage
    Réponses: 4
    Dernier message: 04/07/2005, 19h40
  5. Soustraire des éléments de tableau entre eux
    Par syl2095 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/01/2005, 15h29

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