[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
Bonjour,

Pour commencer deja un grand merci a tous ceux qui tenterons de m'aider.

Je vais essayer d'etre clair mais cela ne sera pas facile.

En gros voila ce que je souhaite mettre en place.

C'est un systeme qui va aller chercher tout les membres inscrit sur ma base et mettre un checkbox coché si ce membre est amis du membre connecté.

Je reussis a ressortir l'ensemble de mes membres avec les checkbox coché ou non correctement.

Je stock ensuite tout cela dans des array afin de pouvoir modifier , ajouetr ou supprimer un amis.

le probleme est que lorsque je supprime un amis par exemple cela decale les lignes de mon array, puisque certaine valeur n'existe plus, ce qui fausse la suite de mes checkbox.

Je cherche donc une solution a ce probleme.

voici un exemple de print sur mes array.

dans cette exemple le membre (n°5) est amis de tout les autres membres (n° 2,3,4,6)

Array ( [0] => 2 ) Array ( [0] => 5 )

Array ( [0] => 3 ) Array ( [0] => 5 )

Array ( [0] => 4 ) Array ( [0] => 5 )

Array ( [0] => 6 ) Array ( [0] => 5 )


dans celui-ci le membre n'est plus amis avec le membre n°3

Array ( [0] => 2 ) Array ( [0] => 5 )

Array ( [0] => 4 ) Array ( [0] => 5 )

Array ( [0] => 6 ) Array ( [0] => 5 )

Warning: Invalid argument supplied for foreach() in c:\documents and settings\garnier\mes documents\web\liste.php on line 88
Array ( [0] => 6 ) Array ( [0] => 5 )


comme vous le voyez cela creer un decalage car la valeur de mon array n'existe plus, ce qui fausse mes checkbox.

voici maintenant les code de ma page en esperant que quelqu'un aura une solution a me proposer.

cdt

Yull

$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'];

foreach ($donneesliste2 as $cle=>$valeur){
// et tu mets ça dans un array
   if( substr($cle,0,8)=="Num_amis"){ // si le nom du champ commence par "Num_amis"
      $index=substr($cle,8);  // tu retrouves le numéro du amis et ça te servira de cle pour l'array
      $array_numamis[$index]=$valeur;
 }
   if( substr($cle,0,8)=="Ind_amis"){ // si le nom du champ commence par "Ind_amis"
      $index=substr($cle,8);  // tu retrouves le numéro du individu et ça te servira de cle pour l'array
      $array_indamis[$index]=$valeur;
 }
}

  print_r($array_numamis);
  print_r($array_indamis);


foreach($array_numamis as $cle=>$value){
$za=$value; // recup numero amis
$wa=$array_indamis[$cle];

?>
<table style="border-collapse: collapse;">
<tr><th style="border: 0px;" VALIGN="top" ALIGN="center">
<?
if (($za == $xa) AND ($wa == $numa))
{
?>
<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');">
A voir également:

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
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 :

// --- $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.

1
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..

??
0
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
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
0
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
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
0

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

echo "<pre>";
print_r($array_amis);
echo "</pre>";


les echo <pre> c'est pour que l'affichage soit "bien" !
0
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
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.

<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
0
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
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
0
Salut,

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
0
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
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 ^^
0
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

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.

0
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
0