soucis de tri dans un tableau

Eléphant du PHP | 250 Messages

25 août 2011, 12:54

Bonjour

Je cherche à faire apparaître/trier un nombre x de lignes par section.
J'ai bien toutes les informations recuillies dans des tableaux; malheureusement, je n'arrive pas à trier les résultats.
Voici le code:
if (isset($_POST['creer']) && !empty($_POST['creer'])){

$titre = stripslashes(trim($_POST['titre']));
$infobdp = stripslashes(trim($_POST['infobdp']));
$nbr_section =  stripslashes(trim( $_POST['nbr_section'])) ? $_POST['nbr_section'] : 0;
$nbr_plat = stripslashes(trim($_POST['nbr_plats']))?$_POST['nbr_plats']:1;
$nom_section = stripslashes( trim($_POST['noms']) )?  $_POST['noms']: 1;
$nom_plat = stripslashes(trim($_POST['nom_plat'])) ? $_POST['nom_plat'] : "";
$prix_plat = stripslashes(trim($_POST['prix_plat']) )? $_POST['prix_plat']: 1;


		//on crée ou on écrit dans le fichier texte qui va bien
		//le titre de la carte
				$insert_titre 	= '<p class="tetecarte">'.$titre.' :</p>';
		//création des sections
				for ($i=1; $i<=$nbr_section; $i++){
						$noms = $nom_section[$i-1];
						
						
		//puis pour chaque section les plats et leurs prix
						$nbr_plats = $nbr_plat[$i-1];	
				for ($n=1; $n<=$nbr_plats; $n++){
						$plats = $nom_plat[$i-1];
						$prix = $prix_plat[$i-1];


																			}	

				$insert_section .= '<p class="secteur">'.$noms.' </p><br />
				<p class="plat"><span>'.$plats.'</span> '.$prix.' €</p>';
																			}

					$insert_bdp 	= '<p class="plat"><span class="note">'.$infobdp.'</span></p>';

				$newmenu = ($insert_titre . $insert_section . $insert_bdp);
		
}

Ce qui me donne à l'affichage, pour 2 sections de 2 lignes chaque:
test 1

azerty 1 €

test 2

uiop 2 €
Où "test1" et "test 2" sont bien les noms des sections (ok, correct) mais où "azerty 1 €" et "uiop 2 €" devraient être dans la section "test 1" et 2 autres lignes dans la section "test 2"
Si je fais un print_r de $_POST, j'ai bien toutes les infos telles que:
Array
(
    [titre] => le titre
    [nbr_section] => 2
    [noms] => Array
        (
            [0] =>  test 1 
            [1] =>  test 2 
        )

    [nbr_plats] => Array
        (
            [0] =>  2 
            [1] =>  2 
        )

    [nom_plat] => Array
        (
            [0] => azerty
            [1] => uiop
            [2] => qwerty
            [3] => glop
        )

    [prix_plat] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )

    [infobdp] => bdp!
    [creer] => Créer
)
J'imagine que la solution est toute bête, mais là, je sèche un peu... :oops:
Tout avis, conseil, aide, est le bienvenu.
Merci d'avance.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 août 2011, 14:21

salut,

ça ne serait pas plus simple de gérée un tableau dans ce style
tableau
section1
info1
info2
section2
info1
info2

etc etc tu peux même ajouter des sous tableaux (catégorie => plat nomplat|prixplat tu a le nombre avec un count).

faut voir comment tu gère ton formulaire;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 250 Messages

25 août 2011, 15:06

Bonjour moogli
Voici le formulaire qui envoie les données:
//déclaration des variables utilisées 
$nbr_section =  isset( $_POST['nbr_section']) ? $_POST['nbr_section'] : 0;
$nbr_plat = isset ($_POST['nbr_plat']) ? $_POST['nbr_plat']:1;
$nom_section = isset( $_POST['nom_section']) ?  $_POST['nom_section']: "";
$nom_plat = isset($_POST['nom_plat']) ? $_POST['nom_plat'] : "";
$prix_plat = isset($_POST['prix_plat']) ? $_POST['prix_plat']: 1;
$titre = isset($_POST['titre']) ? $_POST['titre']: "";
$infobdp = stripslashes(trim($_POST['infobdp']));



echo '<label>Titre:</label><textarea rows="1" cols="30" name="titre">'.$titre.'</textarea><br /><br />';

$selecteur_section = "<select  name= 'nbr_section'>";
for ($i = 0; $i <=10; $i++)
{
        if ($i == $nbr_section)
        {
                $selecteur_section .= "<option selected = 'selected'>$i</option>";
        }
        else
        {
                        $selecteur_section .= "<option >$i</option>";
        }
}
$selecteur_section .= "</select>";

echo '  Choisissez le nombre de sections à afficher:'. $selecteur_section;
echo '<input type="submit" name="go" value="afficher les sections" /><br />';
if (isset($_POST['go']))//si le bouton submit du choix de nombre de section est soumit
	{			//on affiche le nombre de section demandée 
	for ($i=1; $i<=$nbr_section; $i++){
		echo $i.'
		<label>Nom de la section: </label><input type="text" name="nom_section[]" value=" " />
		<input type="hidden" name="nbr_section" value=" '.$nbr_section.' " />
 Choisissez le nombre de plat pour la section: <input type="text" name=" nbr_plat[]" value="" /><br /><br />';
																}
	echo '<input type="submit" name="zou" value="afficher la quantité de ligne souhaitée" /><br /><br />';
}
	if (isset($_POST['zou']))
	{

		for ($i=1; $i<=$nbr_section; $i++){
$noms = $nom_section[$i-1];
		echo $i.'
		<label>Nom de la section: </label><input type="text" name="noms[]" value=" '.$noms.' " /><br />';

$nbr_plats = $nbr_plat[$i-1];
		echo '<input type="hidden" name="nbr_plats[]" value=" '.$nbr_plats.' " />';
				
	for ($n=1; $n<=$nbr_plats; $n++){
	$plats = $nom_plat[$i-1];
	$prix = $prix_plat[$i-1];
		echo $n.'		<label>Nom du plat: </label><input type="text" name="nom_plat[]" value=" '.$plats.' " />
		<label>Prix du plat: </label><input type="text" name="prix_plat[]" value=" '.$prix.' " /><br />';

															}	
													
															echo '<hr />';
															
																	}

	
	
	
			echo '<label>Texte supplémentaire (bas de carte):</label><textarea rows="1" cols="30" name="infobdp">'.$infobdp.'</textarea><br /><br />';




		// on place un bouton permettant de soumettre le formulaire
		echo '<br /><br /><input type="submit" name="creer" value="Créer">';
}//fin du if "zou"
Ce que j'ai posté au début de mon post, vient à la suite.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 août 2011, 19:08

ok,
le problème la c'est que tu ne peux pas savoir quel plat va dans qu'elle section.

le plus simple c'est d'ajouter un niveau a ton tableau
par exemple
for ($i=0; ... ) '
name="nomplat [ $i ][]"
name="prix_plat[ $i] []"

le $i étant l'index de ta boucle cela va permettre de regrouper toutes les infos dans un tableaux
array(2) {
["nomplat"]=>
array(2) {
[1]=>
array(3) {
[0]=>
string(16) "galette complète"
[1]=>
string(12) "kouign amann"
[2]=>
string(17) "galette andouille"
}
[2]=>
array(3) {
[0]=>
string(10) "far breton"
[1]=>
string(15) "crèpe au beurre"
[2]=>
string(16) "crèpe au nutella"
}
}
["prixplat"]=>
array(2) {
[1]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
[2]=>
array(3) {
[0]=>
string(1) "4"
[1]=>
string(1) "5"
[2]=>
string(1) "6"
}
}
}
code test
<?php
echo '<pre>';
var_dump($_POST);
echo '</pre>';
?>
<form action="" method="post">
section 1<br />
nom <input type="text" name="nomplat[1][]" /><br />
prix <input type="text" name="prixplat[1][]" /><br />
nom <input type="text" name="nomplat[1][]" /><br />
prix <input type="text" name="prixplat[1][]" /><br />
nom <input type="text" name="nomplat[1][]" /><br />
prix <input type="text" name="prixplat[1][]" /><br />
section 2<br />
nom <input type="text" name="nomplat[2][]" /><br />
prix <input type="text" name="prixplat[2][]" /><br />
nom <input type="text" name="nomplat[2][]" /><br />
prix <input type="text" name="prixplat[2][]" /><br />
nom <input type="text" name="nomplat[2][]" /><br />
prix <input type="text" name="prixplat[2][]" /><br />


<input type="submit" value="goooo" />
</form>
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 250 Messages

26 août 2011, 09:25

Bonjour
Heu... :oops: ok, moogli, je comprend le raisonnement, c'est l'application qui m'échappe.... :mrgreen:
A quel niveau dois je ajouter la boucle for($i=0) ?
Merci, et désolé pour cette question de boulet....
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 août 2011, 16:49

regarde bien les nom des inputs ;)

c'est ça qu'il te faut modifier ;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 250 Messages

27 août 2011, 18:04

J'ai bien vu, moogli, mais là, est-ce la fatigue ou mon grand âge (ou les 2 en même temps, c'est possible!), je ne m'en sort pas... |*()
Quand je fais un print_r de $_POST je vois bien mon pb:
Array
(
    [titre] => 
    [nbr_section] => 2
    [noms] => Array
        (
            [0] =>  test 1 
            [1] =>  test 2 
        )

    [nbr_plats] => Array
        (
            [0] =>  2 
            [1] =>  2 
        )

    [nom_plat] => Array
        (
            [1] => Array
                (
                    [0] => azery
                    [1] => uiop
                )

            [2] => Array
                (
                    [0] => qwerty
                    [1] => glop
                )

        )

    [prix_plat] => Array
        (
            [1] => Array
                (
                    [0] => 1
                    [1] => 2
                )

            [2] => Array
                (
                    [0] => 3
                    [1] => 4
                )

        )

    [infobdp] => 
    [creer] => Créer
)
Effectivement avec des clés 0 et 1 pour les noms des sections, et 1 et 2 pour les ensembles plats/prix, je ne risque pas de faire correspondre tout ce beau monde, sans compter que, bien sur, un beau "Array" s'affiche en lieu et place des textes saisis pour plat et prix.....
Voici le code tel qu'il est actuellement:
<form method="post">

<?php 
//déclaration des variables utilisées 
$nbr_section =  isset( $_POST['nbr_section']) ? $_POST['nbr_section'] : 0;
$nbr_plat = isset ($_POST['nbr_plat']) ? $_POST['nbr_plat']:1;
$nom_section = isset( $_POST['nom_section']) ?  $_POST['nom_section']: "";
$nom_plat = isset($_POST['nom_plat']) ? $_POST['nom_plat'] : 1;
$prix_plat = isset($_POST['prix_plat']) ? $_POST['prix_plat']: 1;
$titre = stripslashes(trim($_POST['titre']) );
$infobdp = stripslashes(trim($_POST['infobdp']));



echo '<label>Titre:</label><textarea rows="1" cols="30" name="titre">'.$titre.'</textarea><br /><br />';

$selecteur_section = "<select  name= 'nbr_section'>";
for ($i = 0; $i <=10; $i++)
{
        if ($i == $nbr_section)
        {
                $selecteur_section .= "<option selected = 'selected'>$i</option>";
        }
        else
        {
                        $selecteur_section .= "<option >$i</option>";
        }
}
$selecteur_section .= "</select>";

echo '  Choisissez le nombre de sections à afficher:'. $selecteur_section;
echo '<input type="submit" name="go" value="afficher les sections" /><br />';
if (isset($_POST['go']))//si le bouton submit du choix de nombre de section est soumit
	{			//on affiche le nombre de section demandée 
	for ($i=1; $i<=$nbr_section; $i++){
		echo $i.'
		<label>Nom de la section: </label><input type="text" name="nom_section[]" value=" " />
		<input type="hidden" name="nbr_section" value=" '.$nbr_section.' " />
 Choisissez le nombre de plat pour la section: <input type="text" name=" nbr_plat[]" value="" /><br /><br />';
																}
	echo '<input type="submit" name="zou" value="afficher la quantité de ligne souhaitée" /><br /><br />';
}
	if (isset($_POST['zou']))
	{

		for ($i=1; $i<=$nbr_section; $i++){
$noms = $nom_section[$i-1];
		echo $i.'
		<label>Nom de la section: </label><input type="text" name="noms[]" value=" '.$noms.' " /><br />';

$nbr_plats = $nbr_plat[$i-1];
		echo '<input type="hidden" name="nbr_plats[]" value=" '.$nbr_plats.' " />';
				
	for ($n=1; $n<=$nbr_plats; $n++){

	$plats = $nom_plat[$i-1];
	$prix = $prix_plat[$i-1];
		echo $n.'		<label>Nom du plat: </label><input type="text" name="nom_plat['.$i.'][]" value=" '.$plats.' " />
		<label>Prix du plat: </label><input type="text" name="prix_plat['.$i.'][]" value=" '.$prix.' " /><br />';

															}	

													
															echo '<hr />';
															
																	}

	
	
	
			echo '<label>Texte supplémentaire (bas de carte):</label><textarea rows="1" cols="30" name="infobdp">'.$infobdp.'</textarea><br /><br />';




		// on place un bouton permettant de soumettre le formulaire
		echo '<br /><br /><input type="submit" name="creer" value="Créer">';
}//fin du if "zou"

// si l'utilisateur soumet le formulaire on affiche la valeur de tous les champs du formulaire
if (isset($_POST['creer']) && !empty($_POST['creer'])){

$titre = stripslashes(trim($_POST['titre']));
$infobdp = stripslashes(trim($_POST['infobdp']));
$nbr_section =  stripslashes(trim( $_POST['nbr_section'])) ? $_POST['nbr_section'] : 0;
$nbr_plat = stripslashes(trim($_POST['nbr_plats']))?$_POST['nbr_plats']:1;
$nom_section = stripslashes( trim($_POST['noms']) )?  $_POST['noms']: "";
$nom_plat = stripslashes(trim($_POST['nom_plat'])) ? $_POST['nom_plat'] : 1;
$prix_plat = stripslashes(trim($_POST['prix_plat']) )? $_POST['prix_plat']: 1;

    echo '<pre>';echo '<b><u>Détail tableau(x) = </u></b>'; print_r($nom_plat);    echo '</pre>'; 



		//on crée ou on écrit dans le fichier texte qui va bien
		//le titre de la carte
				$insert_titre 	= '<p class="tetecarte">'.$titre.' :</p>';
		//création des sections
				for ($i=1; $i<=$nbr_section; $i++){
						$noms = $nom_section[$i-1];

		//puis pour chaque section les plats et leurs prix
						
				for ($n=0; $n<=$noms; $n++){
					$nbr_plats = $nbr_plat[$i-1];	
						$nom_plats = $nom_plat[$i];
						$prix = $prix_plat[$i];

						}	

				$insert_section .= '<p class="secteur">'.$noms.' </p><br />
				<p class="plat"><span>'.$nom_plats.'</span> '.$prix.' €</p>';
						}

					$insert_bdp 	= '<p class="plat"><span class="note">'.$infobdp.'</span></p>';

				(ici, l'insertion dans des fichiers .txt, et ça (au moins) ça fonctionne)
		
		
}

?>

</form>
Voilà, toute aide est la bienvenue, et merci d'avance pour vos réponses
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 août 2011, 17:03

le pb c'est la validation du dernier formulaire
<?php
if (isset($_POST['creer']) && !empty($_POST['creer'])){

    $titre = stripslashes(trim($_POST['titre']));
    $infobdp = stripslashes(trim($_POST['infobdp']));
    $nbr_section =  stripslashes(trim( $_POST['nbr_section'])) ? $_POST['nbr_section'] : 0;
    $nbr_plat = stripslashes(trim($_POST['nbr_plats']))?$_POST['nbr_plats']:1;
    $nom_section = stripslashes( trim($_POST['noms']) )?  $_POST['noms']: "";
    $nom_plat = stripslashes(trim($_POST['nom_plat'])) ? $_POST['nom_plat'] : 1;
    $prix_plat = stripslashes(trim($_POST['prix_plat']) )? $_POST['prix_plat']: 1;

    echo '<pre>';echo '<b><u>Détail tableau(x) = </u></b>'; print_r($nom_plat);    echo '</pre>';
    //on crée ou on écrit dans le fichier texte qui va bien
    //le titre de la carte
    $insert_titre   = '<p class="tetecarte">'.$titre.' :</p>';
    //création des sections
    for ($i=1; $i<=$nbr_section; $i++){
        $noms = $nom_section[$i-1];
        //puis pour chaque section les plats et leurs prix
        for ($n=0; $n<=$noms; $n++){
            $nbr_plats = $nbr_plat[$i-1];  
            $nom_plats = $nom_plat[$i];
            $prix = $prix_plat[$i];
        }
        $insert_section .= '<p class="secteur">'.$noms.' </p><br />
        <p class="plat"><span>'.$nom_plats.'</span> '.$prix.' €</p>';
    }
?>
tu a
Warning: trim() expects parameter 1 to be string, array given in H:\web\docRoot\test\boro64.php on line 94
Warning: trim() expects parameter 1 to be string, array given in H:\web\docRoot\test\boro64.php on line 95
Warning: trim() expects parameter 1 to be string, array given in H:\web\docRoot\test\boro64.php on line 96
Warning: trim() expects parameter 1 to be string, array given in H:\web\docRoot\test\boro64.php on line 97
Détail tableau(x) = 1
Notice: Uninitialized string offset: 0 in H:\web\docRoot\test\boro64.php on line 105
Notice: Undefined variable: insert_section in H:\web\docRoot\test\boro64.php on line 113
Notice: Uninitialized string offset: 1 in H:\web\docRoot\test\boro64.php on line 105
Notice: Uninitialized string offset: 2 in H:\web\docRoot\test\boro64.php on line 105
Notice: Uninitialized string offset: 3 in H:\web\docRoot\test\boro64.php on line 105
Notice: Uninitialized string offset: 4 in H:\web\docRoot\test\boro64.php on line 105
Notice: Uninitialized string offset: 5 in H:\web\docRoot\test\boro64.php on line 105
pourquoi ? parce que les champs fournis par le formulaire sont des tableaux et non plus des chaines, il te faut donc boucler dessus pour les exploiter.

si tu souhait utilise un trim sur chaque élément => array_walk par exemple.

je te conseil aussi de supprimer tous les espaces qui ne servent a rien dans les champs inputs (qui au final ne seront pas vide car contiennent déjà des espaces ;))

j'ai un peu tous refait :

<form method="post">
<?php
//déclaration des variables utilisées
$nbr_section =  isset( $_POST['nbr_section']) ? $_POST['nbr_section'] : 0;
$nbr_plat = isset ($_POST['nbr_plat']) ? $_POST['nbr_plat']:1;
$nom_section = isset( $_POST['nom_section']) ?  $_POST['nom_section']: "";
$nom_plat = isset($_POST['nom_plat']) ? $_POST['nom_plat'] : 1;
$prix_plat = isset($_POST['prix_plat']) ? $_POST['prix_plat']: 1;
$titre = isset($_POST['titre'])?stripslashes(trim($_POST['titre'])): 'un titre bidon';
$infobdp = isset($_POST['infobdp'])?stripslashes(trim($_POST['titre'])): 'infobdp bidon';
echo '<label>Titre&nbsp;:&nbsp;</label><input type="text" name="titre" value="'.$titre.'"/><br /><br />';

$selecteur_section = '<select  name="nbr_section">';
for ($i = 0; $i <=10; $i++){
    if ($i == $nbr_section){
            $selecteur_section .= "<option selected = \"selected\">$i</option>";
    }
    else{
                    $selecteur_section .= "<option >$i</option>";
    }
}
$selecteur_section .= "</select>";

echo '  Choisissez le nombre de sections &agrave; afficher:'. $selecteur_section;
echo '<input type="submit" name="go" value="afficher les sections" /><br />';
if (isset($_POST['go']))//si le bouton submit du choix de nombre de section est soumit
        {                       //on affiche le nombre de section demandée
        for ($i=1; $i<=$nbr_section; $i++){
                echo $i.'
                <label>Nom de la section: </label><input type="text" name="nom_section[]" value="" />
                <input type="hidden" name="nbr_section" value="'.$nbr_section.' " />
 Choisissez le nombre de plat pour la section: <input type="text" name="nbr_plat[]" value="" /><hr style="width:50%;" />';
                                                                                                                                }
        echo '<input type="submit" name="zou" value="afficher la quantit&eacute; de ligne souhait&eacute;e" />
            <br /><br />';
}
//--
if (isset($_POST['zou'])){
    for ($i=0; $i<$nbr_section; $i++){
        echo $i.'<label>Nom de la section: </label><input type="text" name="noms[]" value="'.$nom_section[$i].'" /><br />';
        echo '<input type="hidden" name="nbr_plats[]" value="'.$nbr_plat[$i].' " />';
        echo '<pre>dump<br />';
        var_dump($nom_plat,$prix_plat);
        echo '</pre>';
        for ($n=0; $n<$nbr_plat[$i]; $n++){
            echo '(',$n.')&nbsp;<label>Nom du plat: </label><input type="text" name="nom_plat['.$i.'][]" />
            <label>Prix du plat: </label><input type="text" name="prix_plat['.$i.'][]" /><br />';
        }      
        echo '<hr />';
    }
    echo '<label>Texte suppl&eacute;mentaire (bas de carte):</label><input type="text" name="infobdp" value="'.$infobdp.'" /><br />';
    // on place un bouton permettant de soumettre le formulaire
    echo '<br /><br /><input type="submit" name="creer" value="Cr&eacute;er">';
}//fin du if "zou"
// si l'utilisateur soumet le formulaire on affiche la valeur de tous les champs du formulaire
    if (isset($_POST['creer']) && !empty($_POST['creer'])){

    echo '<pre>';echo '<b><u>D&eacute;tail tableau(x) = </u></b>'; 
    //le titre de la carte
    $insert_titre   = '<p class="tetecarte">'.$titre.' :</p>';
    $insert_section ='';
    //création des sections
        //puis pour chaque section les plats et leurs prix
        foreach ($_POST['noms'] as $i => $nom){
            
            $insert_section .= '<p class="secteur">'.$nom.' </p><br />';
            foreach($_POST['nom_plat'][$i] as $index => $nom_plat){
                echo '<p class="plat"><span>'.$nom_plat.'</span> '.$_POST['prix_plat'][$i][$index].' &euro;</p>';
            }
        }
    $insert_bdp     = '<p class="plat"><span class="note">'.$infobdp.'</span></p>';
    //  (ici, l'insertion dans des fichiers .txt, et ça (au moins) ça fonctionne)

}
?>
</form>
te reste a mettre tous ça en forme comme tu le souhaite ;)

@+
Il en faut peu pour être heureux ......