[PHP] Pb sur array
Résolu/Fermé
Yull Master
Messages postés
46
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
17 janvier 2008
-
14 nov. 2007 à 15:37
farram - 17 sept. 2008 à 00:25
farram - 17 sept. 2008 à 00:25
A voir également:
- [PHP] Pb sur array
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- \R php ✓ - Forum PHP
- Php alert ✓ - Forum PHP
- Bouton php - Forum PHP
11 réponses
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
15 nov. 2007 à 13:41
15 nov. 2007 à 13:41
Explication (je suis pas très doué pour ca mais qui ne tente rien n'a rien parait-il) :
Un tableau à une dimension te sert à stoker des choses dans des "cases", n'est ce pas ? Et bien un tableau 2D il faut voir ca comme un tableau de tableau. On peut donc distinguer deux niveaux de lecture / écriture dans ces tableaux :
Premier niveau : (cf syntaxe suivante : $tab[0]) sert à stocker l'ensemble des "sous tableaux".
Deuxième niveau : (cf syntaxe suivante : $tab[0][1]) sert à stocker les valeurs pour ton premier tableau.
Prenons un exemple concret, tu veux pouvoir enregistrer une liste d'utilisateur et chaque utilisateur possède une liste d'amis.
Tu peux stoker ces informations sous la forme d'un tableau 2D comme suit :
Ensuite ce qu'il y a de bien en PHP c'est que tu peux remplir tes tableaux sans spécidier pour autant la taille lorsque tu le créé (du moins il me semble), de même, plutot que de référencer avec des indices, tu peux construire ta liste sous forme de "hashtable" qui est en fait un tableau auquel chaque entrée est une clef qui est associée à une valeur comme suit :
Bien sur il faut que les clefs soit uniques, auquel cas si tu tente d'ajouter dans ta liste une entrée dont la clef existe déjà, la valeur sera alors écrasée par la nouvelle, et non ajoutée.
Pour reprendre l'exemple ci-dessus de la gestion d'une liste de "contact", ca donnerai ca :
Encore mieux, quand tu veux ajouter une valeur dans ton tableau, tu n'es pas obligé de spécifier l'indice. Php le gère très bien tout seul :
Tu veux aussi peut etre pouvoir ajouter une valeur uniquement si elle n'existe pas encore (une valeur je parle, pas une clef), dans ce cas un petit test comme suit sera utile :
Voilà, j'espère que ca aura pu t'éclaircir un peu sur l'utilisation d'un tableau 2D.
Un tableau à une dimension te sert à stoker des choses dans des "cases", n'est ce pas ? Et bien un tableau 2D il faut voir ca comme un tableau de tableau. On peut donc distinguer deux niveaux de lecture / écriture dans ces tableaux :
Premier niveau : (cf syntaxe suivante : $tab[0]) sert à stocker l'ensemble des "sous tableaux".
Deuxième niveau : (cf syntaxe suivante : $tab[0][1]) sert à stocker les valeurs pour ton premier tableau.
Prenons un exemple concret, tu veux pouvoir enregistrer une liste d'utilisateur et chaque utilisateur possède une liste d'amis.
Tu peux stoker ces informations sous la forme d'un tableau 2D comme suit :
// --- $tab[0] = liste des amis d'Arthur $tab[0][0] = "Paul"; $tab[0][1] = "Jean"; // --- $tab[1] = liste des amis de Jean $tab[1][0] = "Arthur"; $tab[1][1] = "Simon"; $tab[1][2] = "Nicolas"; // --- etc...
Ensuite ce qu'il y a de bien en PHP c'est que tu peux remplir tes tableaux sans spécidier pour autant la taille lorsque tu le créé (du moins il me semble), de même, plutot que de référencer avec des indices, tu peux construire ta liste sous forme de "hashtable" qui est en fait un tableau auquel chaque entrée est une clef qui est associée à une valeur comme suit :
ma list = { clef => valeur, clef => valeur, clef => valeur, etc.. }
Bien sur il faut que les clefs soit uniques, auquel cas si tu tente d'ajouter dans ta liste une entrée dont la clef existe déjà, la valeur sera alors écrasée par la nouvelle, et non ajoutée.
Pour reprendre l'exemple ci-dessus de la gestion d'une liste de "contact", ca donnerai ca :
// --- $tab[0] = liste des amis d'Arthur $tab["Arthur"][0] = "Paul"; $tab["Arthur"][1] = "Jean"; // --- $tab[1] = liste des amis de Jean $tab["Jean"][0] = "Arthur"; $tab"Jean"][1] = "Simon"; $tab["Jean"][2] = "Nicolas";
Encore mieux, quand tu veux ajouter une valeur dans ton tableau, tu n'es pas obligé de spécifier l'indice. Php le gère très bien tout seul :
// --- $tab[0] = liste des amis d'Arthur $tab["Arthur"][] = "Paul"; $tab["Arthur"][] = "Jean"; // --- $tab[1] = liste des amis de Jean $tab["Jean"][] = "Arthur"; $tab"Jean"][] = "Simon"; $tab["Jean"][ ] = "Nicolas";
Tu veux aussi peut etre pouvoir ajouter une valeur uniquement si elle n'existe pas encore (une valeur je parle, pas une clef), dans ce cas un petit test comme suit sera utile :
if ( ! in_array($tab["Arthur"], "Paul") ){ $tab["Arthur"][] = "Paul"; }
Voilà, j'espère que ca aura pu t'éclaircir un peu sur l'utilisation d'un tableau 2D.
salut,
une idée:
pourquoi tu n'utilises pas un array à deux dimensions
array[5][1]
array[5][2]
etc
ou 5 est ami avec 1 et 2 etc..
??
une idée:
pourquoi tu n'utilises pas un array à deux dimensions
array[5][1]
array[5][2]
etc
ou 5 est ami avec 1 et 2 etc..
??
Yull Master
Messages postés
46
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
17 janvier 2008
1
15 nov. 2007 à 10:03
15 nov. 2007 à 10:03
héhé salut Alain42,
Encore une fois tu viens m'aider et j'en suis fort content.^^
J'ai jamais utilisé les tableau a 2D et j'y connais rien donc je vais me renseigner voir si je comprend quelque chose si tu pense que cela peu resoudre mon probleme.
Tu m'avais tres bien expliquer les array simple car j'y comprenais rien mais bon pour cette fois je vais tenter de comprendre seul vus que je commence a comprendre le focntionnement des array.
Merci de ta reponse, je me renseigne, teste et si j'ai des problemes je reviendrai demander.
En tout cas encore merci de ton aide.
;-)
cdt
Yull
Encore une fois tu viens m'aider et j'en suis fort content.^^
J'ai jamais utilisé les tableau a 2D et j'y connais rien donc je vais me renseigner voir si je comprend quelque chose si tu pense que cela peu resoudre mon probleme.
Tu m'avais tres bien expliquer les array simple car j'y comprenais rien mais bon pour cette fois je vais tenter de comprendre seul vus que je commence a comprendre le focntionnement des array.
Merci de ta reponse, je me renseigne, teste et si j'ai des problemes je reviendrai demander.
En tout cas encore merci de ton aide.
;-)
cdt
Yull
Yull Master
Messages postés
46
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
17 janvier 2008
1
15 nov. 2007 à 11:11
15 nov. 2007 à 11:11
Bon je reussis pa sa trouver un tuto pour m'expliquer clairement l'utilisation des array a 2d.
quelqu'un aurai t'il un lien, ou alors le courage de m'expliquer rapidement ?
Merci d'avance
cdt
Yull
quelqu'un aurai t'il un lien, ou alors le courage de m'expliquer rapidement ?
Merci d'avance
cdt
Yull
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
Pas mal l'expliquation !
et en complément, pour visualiser ce qu'il y a dans ton array quand tu veux debugger, un echo tout simple ne donne rien, alors:
si ton array s'appelle $array_amis
les echo <pre> c'est pour que l'affichage soit "bien" !
Pas mal l'expliquation !
et en complément, pour visualiser ce qu'il y a dans ton array quand tu veux debugger, un echo tout simple ne donne rien, alors:
si ton array s'appelle $array_amis
echo "<pre>"; print_r($array_amis); echo "</pre>";
les echo <pre> c'est pour que l'affichage soit "bien" !
Yull Master
Messages postés
46
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
17 janvier 2008
1
15 nov. 2007 à 14:48
15 nov. 2007 à 14:48
ah merci kij_82 pour cette reponse tres clair.
j'ai reussi a faire correctement mon tableau (enfin je pense ^^).
Mais j'ai toujours le meme probleme avec des checkbox qui ne sont pas cochés alors qu'ils le devraient.
Je vous met donc mon code retouché avec les array 2d.
En tout cas encore un grand merci a kij_82 et Alain42 pour votre aide.
Cdt
Yull
j'ai reussi a faire correctement mon tableau (enfin je pense ^^).
Mais j'ai toujours le meme probleme avec des checkbox qui ne sont pas cochés alors qu'ils le devraient.
Je vous met donc mon code retouché avec les array 2d.
<form method="POST" action="Saveliste.php"> <table style="border-collapse: collapse;"> <tr><th style="border: 0px;" VALIGN="top" ALIGN="center"><img src="images/H.jpg" border= "0"/></th></tr> <tr><th style="border: 0px;" VALIGN="top" ALIGN="center"> <p> <h5> Amis :<br><br> </th></tr> </table> <? include("Conect.php"); if (isset($_SESSION['Login'])) { $numa = $_SESSION['Login']; } else { include("VLog2.php"); } if (isset($_GET['pagela'])) { $pagela = $_GET['pagela']; // On récupère le numéro de la page } else { $pagela = 1; // défaut } //nb de amis par page $nombreDelistesParPage = 10; // On calcule le numéro du premier ami qu'on prend pour le LIMIT de MySQL $premierlisteAafficher = ($pagela - 1) * $nombreDelistesParPage; // On récupère le nombre total de amis $retourliste = mysql_query("SELECT COUNT(*) AS nb_amis FROM individu WHERE Num_ind<>1"); $donneesliste = mysql_fetch_array($retourliste); $totalDeslistes = $donneesliste['nb_amis']; // On calcule le nombre de pages à créer $nombreDePagesliste = ceil($totalDeslistes / $nombreDelistesParPage); // On récupère les 3 dernières news $retourliste = mysql_query("SELECT Nom_ind, Num_ind, conect FROM individu WHERE Num_ind<>1 and Num_ind<>'$numa' ORDER BY Num_ind ASC LIMIT " . $premierlisteAafficher . ', ' . $nombreDelistesParPage); $retourliste2 = mysql_query("SELECT Num_amis, Ind_amis FROM amis WHERE Ind_amis='$numa' ORDER BY Num_amis ASC LIMIT " . $premierlisteAafficher . ', ' . $nombreDelistesParPage); $nb=0; while ($donneesliste = mysql_fetch_array($retourliste)) { $nb++; $donneesliste2 = mysql_fetch_array($retourliste2); $xa = $donneesliste['Num_ind']; $ya = $donneesliste['conect']; $za = $donneesliste2['Num_amis']; $wa = $donneesliste2['Ind_amis']; foreach ($donneesliste2 as $cle=>$valeur){ // et tu mets ça dans un array // --- $tab[$numa] = liste des amis de "$numa" $tab[$numa][$donneesliste2['Num_amis']] = $donneesliste['Nom_ind']; } ?> <table style="border-collapse: collapse;"> <tr><th style="border: 0px;" VALIGN="top" ALIGN="center"> <? if ( ! in_array($tab[$numa], $xa) ) { ?> <input type="checkbox" name="<?php echo 'amis'.$nb ; ?>" CHECKED /> <? } else { ?> <input type="checkbox" name="<?php echo 'amis'.$nb ; ?>" /> <? } ?> <input type="hidden" name="<?php echo 'Ind_amis'.$nb ; ?>" value="<? echo $numa;?>" /> <input type="hidden" name="<?php echo 'Num_amis'.$nb ; ?>" value="<? echo $donneesliste2['Num_amis'];?>" /> <input type="hidden" name="<?php echo 'Num_ind'.$nb ; ?>" value="<? echo $donneesliste['Num_ind'];?>" /> <input type="text" style="border: 0px; color: rgb(48,117,192); font-size: 15px; font-family: Papyrus; text-align: center;" name="<?php echo $xa.$nb ; ?>" value="<? echo $donneesliste['Nom_ind'];?>" onClick="window.open('View.php?numv=<? echo $xa ?>',null,'width=815,height=800, status=yes, directories=yes, toolbar=yes, location=yes, menubar=yes, scrollbars=yes, resizable=yes');"> <? if ($ya==1) { echo "<FONT COLOR=green>(connecté)</FONT>"; } else { echo "<FONT COLOR=red>(non connecté)</FONT>"; } ?> <br> </th></tr> </table> <? } // Fin de la boucle des news echo "<pre>"; print_r($tab[$numa]); echo "</pre>"; ?> </th></tr> <br /></h5> <tr><th style="border: 0px;" VALIGN="top" ALIGN="center"> <br /><input type="image" value="Modifier" src="images/BPM.jpg"></th></tr> </form>
En tout cas encore un grand merci a kij_82 et Alain42 pour votre aide.
Cdt
Yull
Yull Master
Messages postés
46
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
17 janvier 2008
1
16 nov. 2007 à 10:53
16 nov. 2007 à 10:53
ah et desolé mais j'ai oublié de dire qu'n message d'erreur apparait :
Warning: in_array(): Wrong datatype for second argument in c:\documents and settings\garnier\mes documents\web\liste.php on line 100
Warning: in_array(): Wrong datatype for second argument in c:\documents and settings\garnier\mes documents\web\liste.php on line 100
Salut,
if ( ! in_array($tab[$numa], $xa) )
c'est l'inverse: (d'abord l'aiguille, ensuite la botte de foin)
Une suggestion, tes variables $wa $ya $za ne sont pas très explicites, donnes leur des noms plus "parlants", le code est plus facile à comprendre.
par ex à la place de $za => $Num_amis_lu
@lain
if ( ! in_array($tab[$numa], $xa) )
c'est l'inverse: (d'abord l'aiguille, ensuite la botte de foin)
if ( ! in_array( $xa,$tab[$numa]) )
Une suggestion, tes variables $wa $ya $za ne sont pas très explicites, donnes leur des noms plus "parlants", le code est plus facile à comprendre.
par ex à la place de $za => $Num_amis_lu
@lain
Yull Master
Messages postés
46
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
17 janvier 2008
1
16 nov. 2007 à 14:00
16 nov. 2007 à 14:00
Re Salut,
Merci Alain42 tu es vraiment un chef. ca marche parfaitement hormis des message d'erreur qui apparaissent tjrs mais le truc fonctionne.
au passage je vais suivre tes conseil et renommer mes variable.
Encore merci donc a kij_82 pour sa superbe explication et a Alain42 pour toute l'aide qu'il m'a apporté.
Vive CCN et vive mes deux sauveurs ^^
Merci Alain42 tu es vraiment un chef. ca marche parfaitement hormis des message d'erreur qui apparaissent tjrs mais le truc fonctionne.
au passage je vais suivre tes conseil et renommer mes variable.
Encore merci donc a kij_82 pour sa superbe explication et a Alain42 pour toute l'aide qu'il m'a apporté.
Vive CCN et vive mes deux sauveurs ^^
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
16 nov. 2007 à 14:35
16 nov. 2007 à 14:35
Bon, j'arrive en retard on dirais :)
J'avais deux trois choses à dire mais c'est résolu, tant mieux, j'efface donc mon message.
Bon courage pour la suite.
slt à tous moi j'ai un pti pb j'ai un espace membre tkl tout va bien avec des profils mais ce que j'aimerais faire c'est l'ajout d'ami un membre va voir la page d'un autre membre et à la possibilité d'ajouter ce membre dans ses ami. Est ce possible d'avoir une réponse? je part de rien du tout concernant cette fonction.
merci d'avance
merci d'avance