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 valeurs d'un tableau


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut Supprimer des valeurs d'un tableau
    Bonjour à tous,

    Je cherche à faire à supprimer toutes les valeurs vide de ce tableau. Pour sa j'utilise le unset avec array_search mais sa ne fonctionne pas j'ai l'impression...

    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    unset($matches[array_search(" ", $matches)]);
    unset($matches[array_search(" ", $matches)]);
    unset($matches[array_search("> <", $matches)]);
    print_r($matches);
    Array
    (
    [1] => Array
    (
    [0] => ><
    [1] =>
    )

    [2] => Array
    (
    [0] => >&nbsp;<
    [1] => &nbsp;
    )

    [3] => Array
    (
    [0] => ><
    [1] =>
    )

    [4] => Array
    (
    [0] => ><
    [1] =>
    )

    [5] => Array
    (
    [0] => ><
    [1] =>
    )

    [6] => Array
    (
    [0] => ><
    [1] =>
    )

    [7] => Array
    (
    [0] => >SEPTEMBRE 2010<
    [1] => SEPTEMBRE 2010
    )....
    Si quelqu'un aurait une idée, je suis preneuse ^^

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Array <- 1ère dimension
    (
    [1] => Array <- 2ème dimension
           (
           [0] => ><
           [1] =>
           )
    }
    Ici, on remarque que chaque élément du tableau $matches contient un tableau, donc c'est un tableau à 2 dimensions, et non 1 dimension, c'est pour ça que ça ne fonctionne pas.

    Puis on remarque aussi que le 1ère élément n'y est plus, celui de l'indice 0.
    A mon avis, il existait à sa création, c'est qu'il a très certainement été supprimé par 1 des unset().
    Mais il n'aurait pas dû être supprimé, cependant, la suppresion c'est effectié car la fonction array_search() a dû retourner false.
    False étant interprété comme 0, l'indice 0 a été supprimé.
    Attention donc à ce piège, et c'est pour cela que la doc (pour cette fonction) explique qu'il faut utiliser === pour savoir si c'est false ou l'indice 0 qui est retourné.


    Il te faudrait parcourir chaque élément en boucle, la 1ère dimension pour ensuite rechercher dans le tableau de la 2ème dimension si les valeurs que tu teste sont présents ou pas (attention donc à différencier false et 0).
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut
    Merci pour ta réponse.

    Par contre je ne sais pas comment faire ce que tu me conseille à savoir la boucle qui va parcourir le tableau et ensuite tester avec le array_search. Aussi je me demande ou mettre le ===

    Peut tu me donner un exemple, je trouve pas avec le manuel, simplement le message de mise en garde...

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Pour faire la boucle sur $matches, et bien foreach().
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut
    Ba j'ai essayé de faire ce que tu me conseille mais sa marche pas...

    Tu peux me dire ce que je fais mal ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    foreach ($matches as $tab) {
     
    	for ($i=1; $i<=2; $i++) {
     
    	$indice = array_search(" ", $matches);
     
    	if ($indice !=false) {
    	   unset($tab[$indice][$i]);
    	}
    	}
    }
    ?>

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Essai comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach ($matches as $key => $tab) {
    	$indice = array_search(" ", $tab);
     
    	if ($indice !== false) {
    		//
    	}
    }
    Théoriquement, il n'y a pas besoinde faire 2 boucles.
    Puis la recherche doit ce faire sur la 2ème dimension, donc $tab, c'est elle qui contient les valeur (&nbsp; etc ...)
    Puis pour le false, faut faire !== (et non !=), qui inclus une vérification sur la valeur et le type.

    Par contre j'ai vonlontaire supprimé le unset(), car finalement, j'en sais rien si le but recherché est de supprimer l'élément de la 1ère ou la 2ème dimension, là c'est à toi de voir.
    Par contre, si tu veux faire une suppression, il faudra l'appliquer sur $matches, surtout pas sur $tab, car $tab est une nouvelle variable, elle ne fait pas partie de $matches.
    Rajouter la clé ($key) au foreach() te seras nécessaire (voir code).
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut
    Merci

    En faite le tableau que je donnais en exemple tout à l"heure, je veux supprimer totalement les indices 1 à 6 inclus mais je garde tel quel le 7...

    Du coup sa devient ça le code ou je dois utiliser $indice ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    foreach ($matches as $key => $tab) {
    	$indice = array_search(" ", $tab);
     
    	if ($indice !== false) {
    		unset ($tab[$key]);
    	}
    }
    ?>

    Le tableau

    Array
    (
    [1] => Array
    (
    [0] => ><
    [1] =>
    )

    [2] => Array
    (
    [0] => >&nbsp;<
    [1] => &nbsp;
    )

    [3] => Array
    (
    [0] => ><
    [1] =>
    )

    [4] => Array
    (
    [0] => ><
    [1] =>
    )

    [5] => Array
    (
    [0] => ><
    [1] =>
    )

    [6] => Array
    (
    [0] => ><
    [1] =>
    )

    [7] => Array
    (
    [0] => >SEPTEMBRE 2010<
    [1] => SEPTEMBRE 2010
    )

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par RunCodePhp
    il faudra l'appliquer sur $matches, surtout pas sur $tab
    Tu l'applique le unset sur $tab, ça ne va pas le faire à mon sens.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut
    Je viens d'essayer sa, mais les entrées que je cherche à supprimer sont encore là...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    foreach ($matches as $key => $tab) {
    	$indice = array_search(" ", $tab);
     
    	if ($indice !== false) {
    		unset ($matches[$key]);
    	}
    }
    ?>

  10. #10
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    As tu fais un essai en recherchant un caractère ou une chaine ou tu est sûr, comme &nbsp; parce que un espace, là j'ai un doute.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut
    J'ai adapté la recherche mais il ne trouve pas tout...
    Par exemple, dans le nouveau tableau, je voudrais qu'il me vire l'entré 10 et 15 mais pas les autres enfin faut que la valeur de $matches[7][1] reste mais sa ne fonctionne pas

    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
     
    foreach ($matches as $key => $tab) {
    	$indice = array_search("><", $tab);
     
    	if ($indice !== false) {
    		unset ($matches[$key]);
    	}
     
    	$indice = array_search(">&nbsp;<", $tab);
     
    	if ($indice !== false) {
    		unset ($matches[$key]);
    	}
     
    	$indice = array_search(">", $tab);
     
    	if ($indice !== false) {
    		unset ($matches[$key]);
    	}
    }


    Array
    (
    [7] => Array
    (
    [0] => >SEPTEMBRE 2010<
    [1] => SEPTEMBRE 2010
    )

    [10] => Array
    (
    [0] => >
    <
    [1] =>

    )

    [13] => Array
    (
    [0] => > Date<
    [1] => Date
    )

    [15] => Array
    (
    [0] => >
    <
    [1] =>

    )

  12. #12
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Mais observe ce que contient ton tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [10] => Array
    (
    [0] => >
    <
    [1] =>
     
    )
    Donc pour l'élément 0 de la clé 10, entre les >< il y a apparemment un fin de ligne, et c'est un caractère : \n ou \r\n ou PHP_EOL, ça dépend du système où ça été créé.


    Aussi, array_search() accepte un tableau en 1er paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_search(array('><', '>&nbsp;<', '>&nbsp;<'), $tab);
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut
    Je viens de changer avec >\n< et il me trouve tout ce qu'il faut sauf 1... l'entrée 24. Sur le même principe j'ai recherché >\n<, >\r\n<, >\r< mais aucun ne supprime cette ligne ?

    Qu'elle est ce php eol dont tu parle ?

    [24] => Array
    (
    [0] => >
    <
    [1] =>

    )

  14. #14
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Qu'elle est ce php eol dont tu parle ?
    Moi, je vois un passage à la ligne ici, sinon serait :
    ><
    alros que c'est :
    >
    <


    Mais ce que tu veux faire, ne ne serait il pas si le 1er caractère est > et le dernier <, et si c'est la cas, supprimer ? (fonction strpos)
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut
    En fait pour moi les cas 10, 15 et 24 sont identiques. Les cas 10 et 15 sont résolue par la recherche de >\n< mais pas le 24... j'ai essayer d'autres version mais aucune n'arrive à supprimer cette ligne

    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
     
    $indice = array_search(">\n<", $tab);
     
    	if ($indice !== false) {
    		unset ($matches[$key]);
    	}
     
    	$indice = array_search(">\r\n<", $tab);
     
    	if ($indice !== false) {
    		unset ($matches[$key]);
    	}
     
    	$indice = array_search(">\n\r<", $tab);
     
    	if ($indice !== false) {
    		unset ($matches[$key]);
    	}
     
    	$indice = array_search(">\r<", $tab);
     
    	if ($indice !== false) {
    		unset ($matches[$key]);
    	}

    Pour le contrôle du champs contenant > au début et < à la fin, je ne peux faire sa car tous les indices 0 des autres lignes contient des données et je ne veux pas les supprimer :/

  16. #16
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Pour le contrôle du champs contenant > au début et < à la fin, je ne peux faire sa car tous les indices 0 des autres lignes contient des données et je ne veux pas les supprimer :/
    Ok.

    Si tu ne sais vraiment pas ce que contient la chaine, essai de faire des echo sur toute la chaine en exploitant la fonction ord().
    Cette fonction retourne un entier (un int) correspondant au code ascii, mais ça accepte 1 seul caractère, donc un autre foreach sera nécessaire sur la chaine.
    Sur le Net tu trouvera des tableau ASCII, et à quoi ça correspond.
    De mémoire, 10 (ou 13) correspond à \n (eol).
    Ca veut dire que tu pourrait exploiter la fonction inverse, soit chr(10) dans le array_search() une fois obtenu l'entier du caractère.
    Je ne sais pas si tu vois le truc.


    Ceci dit, normalement faudrait que tu échappe le \ :
    Essai, car là j'hésite un peu.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 116
    Points : 62
    Points
    62
    Par défaut
    pour le \\n si je le change comme ça, cela ne fonctione plus.

    je viens de regarder la doc pour la fonction ord() mais je ne sais pas comment exploser ma chaine originel, je n'ai pas de paramètre pour un explode... ( le ord du dernier caractère renvoit 62 qui est <

    une solution ?

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

Discussions similaires

  1. [WD10] Afficher des valeurs dans un tableau
    Par dj-julio dans le forum WinDev
    Réponses: 4
    Dernier message: 19/03/2014, 11h32
  2. Supprimer des valeurs d'un tableau
    Par Trax31 dans le forum C
    Réponses: 8
    Dernier message: 30/05/2013, 12h27
  3. [Tableaux]Ajouter des valeurs dans un tableau
    Par Antoine1183 dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 03/04/2005, 13h41
  4. [VB6] recuperer des valeurs ds un tableau html avec vb!!
    Par leo13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/12/2004, 13h02
  5. Décaler des valeurs dans un tableau
    Par sh2003 dans le forum Langage
    Réponses: 6
    Dernier message: 20/03/2004, 16h01

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