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 :

Trier un tableau $_POST [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Trier un tableau $_POST
    Bonjour à tous,

    Voici le print_r d'un tableau $_POST :

    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
     
        [tel] => 00.00.00.00.00
        [nb_prods] => 4
     
     
        [id_prod] => Array
            (
                [0] => 158
                [1] => 1555
                [2] => 1537
                [3] => 1277
            )
     
        [reference] => Array
            (
                [0] => toto
                [1] => tata
                [2] => tutu
                [3] => titi
            )
     
        [prix] => Array
            (
                [0] => 0.50
                [1] => 23.34
                [2] => 13.60
                [3] => 8.73
            )
     
        [tva] => Array
            (
                [0] => 19.60
                [1] => 7.00
                [2] => 7.00
                [3] => 7.00
            )
     
        [livraison] => Array
            (
                [0] => tel
                [1] => exp
                [2] => exp
                [3] => exp
            )
    )
    Comment trier $_POST sur le sous-tableau $_POST['livraison'] ?
    Est-ce possible avec une fonction et uasort ?
    Merci de vos tuyaux.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Par défaut
    Je dirai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    asort($_POST['livraison']);
    Mais peux tu nous en dire plus sur ce que tu veux faire ?

  3. #3
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonsoir,

    Je doute que asort($_POST['livraison']); puisse trier $_POST , enfin tous ses sous-tableaux sur le critère des livraisons... C'est plus compliqué que ça.
    Tu vois que les sous_tableaux sont des produits, avec un id, un prix, un mode de livraison, et qu'ils sont au nombre de 4.

    Je veux qu'ils s'affichent ordonnés par la colonne "livraison". C'est à dire que le produit de livraison "tel" , dans l'exemple le 1er , référence "toto", s'affiche en dernier alors que c'est le premier a avoir été saisi dans le formulaire...

  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
    Par défaut
    Salut

    A mon avis, c'est la manière dont serait construit le formulaire qui n'irait, les classements ne correspondraient pas.

    Tu as des produits, et pour chaque produit devrait correspondre 1 identifiant, 1 référence, 1 prix, 1 tva et 1 mode de livraison.

    Pour exemple, construire le formulaire ainsi devrait améliorer les choses :
    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
     
    <form action="page.php" method="post">
    <!-- 1er produit -->
    <input type="text" name="produits[0]][id_prod]" value="" />
    <input type="text" name="produits[0]][reference]" value="" />
    <input type="text" name="produits[0][prix]" value="" />
    <input type="text" name="produits[0][tva]" value="" />
    <input type="text" name="produits[0][livraison]" value="" />
     
    <!-- 2ème produit -->
    <input type="text" name="produits[1]][id_prod]" value="" />
    <input type="text" name="produits[1]][reference]" value="" />
    <input type="text" name="produits[1][prix]" value="" />
    <input type="text" name="produits[1][tva]" value="" />
    <input type="text" name="produits[1][livraison]" value="" />
     
    </form>
    On obtiendra un tableau $_POST structuré ainsi :
    $_POST['produit'][0][id_prod] (1er produit, valeur : 158)
    etc ...

    Une boucle foreach sur $_POST['produit'] devrait te permettre d'obtenir chaque élément correspondant sans devoir faire de trie.

    De même qu'il n'y pas besoin de renseigner le nombre de produits dans le formulaire, un count($_POST['produits']) retournera ce nombre.


    Si chaque produit ayant un mode de livraison, et qu'une livraison contient un sous ensemble, et bien pareil, il suffit de structurer le formulaire afin d'obtenir un tableau à plusieurs dimensions.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <!-- 1er produit -->
    <input type="text" name="produits[0]][id_prod]" value="" />
    <input type="text" name="produits[0]][reference]" value="" />
    <input type="text" name="produits[0][prix]" value="" />
    <input type="text" name="produits[0][tva]" value="" />
     
    <input type="text" name="produits[0][livraison][sous_ensemble][0]" value="" />
    <input type="text" name="produits[0][livraison][sous_ensemble][1]" value="" />
    Suffit d'imbriquer une autre boucle foreach() sur $_POST['produits'][indice]['sous_ensemble'] dans la 1ère boucle afin d'obtenir les valeurs des sous ensembles du produit courant.


    Tout tient théoriquement dans la manière de structurer le formulaire.

  5. #5
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour, et merci de ta réponse

    Effectivement, mon formulaire n'est pas vraiment construit comme cela, car les champs sont générés dynamiquement avec Ajax en fonction d'un nombre de produits choisi par le user.
    Exemple : il choisit 4, j'affiche 4 "blocs" de formulaires vierges avec chacun référence, nom, prix, livraison...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <input type="text" name="reference[<?php echo $i; ?>]">
    <input type="text" name="prix[<?php echo $i; ?>]">
    ...
    Les champs "nom" sont en fait des listes déroulantes proposant toute la gamme et il choisit donc les 4 produits. En fonction du choix, toujours avec Ajax, tous les autres champs sont auto-remplis.
    Résultat : le tableau que j'ai mis en exemple dans le 1er post.
    Mais évidemment, l'ordre est toujours celui du choix du user.

    Et l'idée est que, au post du formulaire, les produits dont le champ "livraison" est à "tel" s'affichent en dessous de ceux dont le champ "livraison" est à "exp".
    Et j'aurais préféré ne pas changer toute la structure du formulaire...

  6. #6
    Membre chevronné Avatar de hariman
    Homme Profil pro
    Développeur Java, Android
    Inscrit en
    Janvier 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur Java, Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 200
    Par défaut
    Bonjour,

    Un simple tri à bulle devrait faire l'affaire, et lors de la permutation de 2 valeurs du sous-tableau "livraison", on permute aussi les valeurs correspondants dans les autres sous-tableau.

  7. #7
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour,

    Pourrais-tu préciser ?

  8. #8
    Membre chevronné Avatar de hariman
    Homme Profil pro
    Développeur Java, Android
    Inscrit en
    Janvier 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur Java, Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 200
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    do {
      $permutation = false;
      for ($i = 0; $i < $_POST["nb_prods"]-1; $i++) {
        if (strcmp($_POST["livraison"][$i], $_POST["livraison"][$i+1]) > 0) {
          on permute $_POST["livraison"][$i] et $_POST["livraison"][$i+1];
          on permute aussi les autres valeurs des sous-tableaux :
            on permute $_POST["id_prod"][$i] et $_POST["id_prod"][$i+1];
            on permute $_POST["reference"][$i] et $_POST["reference"][$i+1];
            ...
            $permutation = true;
        }
      }
    } while ($permutation);
    Ou suis-je hors-sujet ?

  9. #9
    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
    Par défaut
    Et j'aurais préféré ne pas changer toute la structure du formulaire...
    C'est pourtant la meilleur chose à faire.
    Certes, si tout est déjà fait, programmé, ça fait du boulot, ça freine un peu, mais il faut quand même bien comprendre que c'est le manque de structure qui provoque ça.

    Il faut comprendre aussi que, vu ce que tu obtiens ne reflète pas la réalité, du coup, ce que tu rajouteras actuellement ne fera qu'enfoncer le clou un peu plus.

    Normalement il est préférable de créer une structure proche voir similaire au niveau du formulaire selon la réalité, et aussi de ce qui doit être fait dessus.
    Ces éléments là viennent surement d'une base de donnée, leur structure devraient alors être proche de la base de donnée.
    D'autant plus que le but sera très certainement de les insérer dans une Bdd.


    Génère en Ajax/JS cette structure là, exploite les tableaux en plusieurs dimensions.
    Où est la difficulté ?
    Comment fais tu pour générer ces input ?

  10. #10
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    On permute
    Qu'entends-tu par là ? array_flip ?
    Effectivement l'idée est là puisque il faut que en fonction de l'ordre de "livraison" les autres tableaux soient modifiés de sorte que

    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
     
    array(
      [id_prod] => Array
            (
                [0] => 158
                [1] => 1555
                [2] => 1537
                [3] => 1277
            )
     [livraison] => Array
            (
                [0] => 'exp'
                [1] => 'exp'
                [2] => 'tel'
                [3] => 'exp'
            )
     
    )
    devienne :

    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
     
    array(
      [id_prod] => Array
            (
                [0] => 158
                [1] => 1555
                [2] => 1277
                [3] => 1537
            )
     [livraison] => Array
            (
                [0] => 'exp'
                [1] => 'exp'
                [2] => 'exp'
                [3] => 'tel'
            )
    )
    Après...permuter, je vois pas bien...

  11. #11
    Membre chevronné Avatar de hariman
    Homme Profil pro
    Développeur Java, Android
    Inscrit en
    Janvier 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur Java, Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 200
    Par défaut
    permuter = échanger

    Le code pour permuter le contenu de 2 variables :

    $tmp = $_POST["livraison"][$i];
    $_POST["livraison"][$i] = $_POST["livraison"][$i+1];
    $_POST["livraison"][$i+1] = $tmp;

    Mais si c'est trop compliqué, je te conseille de suivre les idées de RunCodePhp

  12. #12
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bien bien, je vais étudier tout cela de plus près...
    Merci à tout les deux de votre aide précieuse.

  13. #13
    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
    Par défaut
    Essai de produire un tableau du genre :
    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
     
    array(
      [produits] => Array
            (
                [0] => Array
                    (
                        [id] => 158
                        [prix] => un_prix
                        [livraison] => 'exp'
                        ... etc ...
                    )
                [1] => Array
                    (
                        [id] => 1555
                        [prix] => un_prix
                        [livraison] => 'exp'
                        ... etc ...
                    )
            )
    )
    Ou peut être
    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
     
    array(
      [produits] => Array
            (
                [158] => Array
                    (
                        [prix] => un_prix
                        [livraison] => 'exp'
                        ... etc ...
                    )
                [1555] => Array
                    (
                        [prix] => un_prix
                        [livraison] => 'exp'
                        ... etc ...
                    )
            )
    )
    (ici, la clé est la valeur du id_prod, du coup, on plus besoin de champ 'id_prod' dans le formulaire.
    Faut voir.


    En admettant qu'on prévoit de faire des pré-vérifications en JS, comme vérifier que tel ou tel produit contient bien un prix, une référence, etc ..., une bonne structure facilitera là aussi ces vérifications.

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

Discussions similaires

  1. [Débutant] Trier un tableau en 2 boucles
    Par SaladinDev dans le forum Assembleur
    Réponses: 9
    Dernier message: 07/05/2005, 22h38
  2. Trier un tableau par rapport à un autre tableau
    Par deaven dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 02/05/2005, 09h27
  3. [Débutant] Remplir et trier un tableau
    Par james-dean dans le forum Assembleur
    Réponses: 15
    Dernier message: 01/05/2005, 17h40
  4. Trier un tableau par ordre croissant
    Par Halleck dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 01/11/2004, 00h04
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

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