Page 1 sur 1

array_diff()

Posté : 16 juil. 2007, 16:02
par brm
Bonjour et merci à ceux qui me liront et, j'espère, m'aideront.

Suite à une requête MySql, j'obtiens un tableau associatif $aFichiers :

Code : Tout sélectionner

Array ( [0] => Array ( [nom] => essai1 ) [1] => Array ( [nom] => essai2 ) [2] => Array ( [nom] => essai3 ) )
essai1, essai2 et essai3 sont des noms de fichiers html contenant des exercices.

2° requête et 2° tableau associatif $aFaits :

Code : Tout sélectionner

Array ( [0] => Array ( [nom] => essai1 ) )
qui m'indique que l'élève a déjà fait l'exercice 1.

Je voudrais afficher uniquement les exercices non faits essai2 et essai3 (pour éviter qu'il ne passe son temps à faire plusieurs fois le même et obtenir un score "canon").

Pour ce faire j'utilise
$aTodo[] = array_diff_assoc($aFichiers, $aFaits)
Mais je n'obtiens plus la même structure :

Code : Tout sélectionner

Array ( [0] => Array ( [1] => Array ( [nom] => essai2 ) [2] => Array ( [nom] => essai3 ) ) [1] => Array ( [0] => Array ( [1] => Array ( [nom] => essai2 ) [2] => Array ( [nom] => essai3 ) ) ) )
De sorte qu'en essayant d'afficher les fichiers encore à faire avec leur lien
$i = 1;
while ($i<=$nTodo) {	
	echo "<p><a href=\"",$aTodo[$i-1]['nom'].".html","\">",$aTodo[$i-1]['nom'],"</a></p>"; 
$i++;
j'obtiens le message undefined index nom in ....

J'ai honte mais je suis perdu

Merci d'avance pour votre aide.

Posté : 16 juil. 2007, 16:06
par Sékiltoyai
Normalement si tes tables sont bien faites, tu n'as pas besoin de 2 requètes mais d'une seule. Donc est ce que tu peux montrer tesrequètes et l'architecture de tes tables ?

Posté : 16 juil. 2007, 16:22
par brm
merci de réagir !
J'ai entre autres 2 tables : l'une contenant le nom des tests avec les bonnes réponses, l'autre où à chaque visite d'élève un enregistrement s'ajoute contenant l'ID de l'élève, le nom du test qu'il a présenté, les réponses qu'il a choisies et son score.
Quand un élève se connecte, la première requête fournit donc un array de tests existants et la 2° me donne les tests déjà réalisés par l'élève.

quand je compare les 2 arrays, je m'attendais (naïvement) à avoir comme résultat :
Array ( [0] => Array ( [nom] => essai2 ) [1] => Array ( [nom] => essai3 ) )

Posté : 16 juil. 2007, 16:42
par d0m
je pense que le problème vient du fait que les éléments de tes 2 tableaux sont eux mêmes des tableaux.
La comparaison entre tableau ne doit pas marcher. C'est comme si tu essaiais de comparer 2 tableaux entre eux avec ==.

le meilleur moyen c'est de mettre les tableaux à une dimension:

$aFichiers_2 :
Array ( essai1, essai2, essai3 )

$aFaits_2 :
Array ( essai1 )

et là de les comparer.

Posté : 16 juil. 2007, 17:09
par brm
Ok mais alors comment obtenir des tableaux à une dimension en réponse à une requête MySql?

Posté : 16 juil. 2007, 17:38
par Sékiltoyai
Comme je t'ai déjà dit, tu as mal concu tes requètes, normalement, tu ne devrais pas avoir de différence à faire. Avec une requète bien faite, tu peux avoir tes informations sans avoir à les modifier après.
Donc je te redemande de poster les requètes et si possible le shéma précis des tables.

Posté : 16 juil. 2007, 18:15
par d0m
Ok mais alors comment obtenir des tableaux à une dimension en réponse à une requête MySql?
en parcourant le tableau résultat de ta requête et en créant un tableau à une dimension.

Sinon comme l'a dit Sékiltoyai tu peux en une seule requete SQL sélectionner les exercices disponible qui ne sont pas dans la table des exercices déjà faits pour l'élève en quesion :

du genre

Code : Tout sélectionner

SELECT nom FROM tableExoDispo WHERE nom NOT IN (SELECT nom FROM table2 WHERE nomEleve=...)

Posté : 16 juil. 2007, 21:26
par Sékiltoyai
Au passage, les sous-requètes ne sont disponibles que depuis PHP5...

Posté : 16 juil. 2007, 21:47
par Hubert Roksor
Je crois que tu voulais dire MySQL 4.1, pas PHP 5 :roll:

Posté : 16 juil. 2007, 22:24
par Sékiltoyai
Oui, au temps pour moi. En fait je voulais dire MySQL5, mais j'oublie toujours que ca a été implémenté avant...

Posté : 17 juil. 2007, 09:35
par brm
Je reviens un peu tard mais un grand merci : ça marche en effet très bien avec les 2 SELECT imbriqués (et en plus le code est vachement plus court).

Je reste quand même surpris par le comportement de la array_diff()

Posté : 17 juil. 2007, 09:57
par d0m
Je reste quand même surpris par le comportement de la array_diff()
Note: Notez que cette fonction ne vérifie qu'une dimension d'un tableau à n-dimensions. Bien sur, vous pouvez vérifier des dimensions plus profondes en utilisant array_diff($array1[0], $array2[0]);.
la comparaison de tableau donne souvent des résultats bizarres pour nous.

Posté : 17 juil. 2007, 17:40
par Sékiltoyai
Je reviens un peu tard mais un grand merci : ça marche en effet très bien avec les 2 SELECT imbriqués (et en plus le code est vachement plus court).

Je reste quand même surpris par le comportement de la array_diff()
Bien entendu, si tu utilises cette requète, tu dois supprimer les deux autres, sauf si tu veux plomber ton serveur SQL...