Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2012, 20h34   #1
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Par défaut Trier un tableau $_POST

Bonjour à tous,

Voici le print_r d'un tableau $_POST :

Code :
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.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 22h11   #2
Futur Membre du Club
 
Inscription : juillet 2010
Messages : 32
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 32
Points : 19
Points : 19
Je dirai

Code :
1
2
 
asort($_POST['livraison']);
Mais peux tu nous en dire plus sur ce que tu veux faire ?
pablofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 22h40   #3
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
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...
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 06h13   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
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 :
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 :
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.
__________________
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 06h37   #5
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
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 :
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...
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 07h18   #6
Membre éclairé
 
Avatar de hariman
 
Homme Luc Hariman RANDRIANOMENJANAHARY
Développeur Java
Inscription : janvier 2008
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Luc Hariman RANDRIANOMENJANAHARY
Localisation : Ile Maurice

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

Informations forums :
Inscription : janvier 2008
Messages : 175
Points : 349
Points : 349
Envoyer un message via MSN à hariman Envoyer un message via Skype™ à hariman
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.
__________________
Les boutons et adorent être cliqués, donc ne les oubliez pas
hariman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 07h30   #7
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Bonjour,

Pourrais-tu préciser ?
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 07h47   #8
Membre éclairé
 
Avatar de hariman
 
Homme Luc Hariman RANDRIANOMENJANAHARY
Développeur Java
Inscription : janvier 2008
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Luc Hariman RANDRIANOMENJANAHARY
Localisation : Ile Maurice

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

Informations forums :
Inscription : janvier 2008
Messages : 175
Points : 349
Points : 349
Envoyer un message via MSN à hariman Envoyer un message via Skype™ à hariman
Code :
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 ?
__________________
Les boutons et adorent être cliqués, donc ne les oubliez pas
hariman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 07h52   #9
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Citation:
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 ?
__________________
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 07h58   #10
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Citation:
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 :
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 :
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...
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 08h05   #11
Membre éclairé
 
Avatar de hariman
 
Homme Luc Hariman RANDRIANOMENJANAHARY
Développeur Java
Inscription : janvier 2008
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Luc Hariman RANDRIANOMENJANAHARY
Localisation : Ile Maurice

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

Informations forums :
Inscription : janvier 2008
Messages : 175
Points : 349
Points : 349
Envoyer un message via MSN à hariman Envoyer un message via Skype™ à hariman
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
__________________
Les boutons et adorent être cliqués, donc ne les oubliez pas
hariman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 08h30   #12
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Bien bien, je vais étudier tout cela de plus près...
Merci à tout les deux de votre aide précieuse.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 09h05   #13
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Essai de produire un tableau du genre :
Code :
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 :
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.
__________________
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h46.


 
 
 
 
Partenaires

Hébergement Web