array_diff()

brm
Petit nouveau ! | 7 Messages

16 juil. 2007, 16:02

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.

ViPHP
ViPHP | 5924 Messages

16 juil. 2007, 16:06

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 ?

brm
Petit nouveau ! | 7 Messages

16 juil. 2007, 16:22

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

d0m
Mammouth du PHP | 1141 Messages

16 juil. 2007, 16:42

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.

brm
Petit nouveau ! | 7 Messages

16 juil. 2007, 17:09

Ok mais alors comment obtenir des tableaux à une dimension en réponse à une requête MySql?

ViPHP
ViPHP | 5924 Messages

16 juil. 2007, 17:38

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.

d0m
Mammouth du PHP | 1141 Messages

16 juil. 2007, 18:15

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=...)

ViPHP
ViPHP | 5924 Messages

16 juil. 2007, 21:26

Au passage, les sous-requètes ne sont disponibles que depuis PHP5...

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 juil. 2007, 21:47

Je crois que tu voulais dire MySQL 4.1, pas PHP 5 :roll:

ViPHP
ViPHP | 5924 Messages

16 juil. 2007, 22:24

Oui, au temps pour moi. En fait je voulais dire MySQL5, mais j'oublie toujours que ca a été implémenté avant...

brm
Petit nouveau ! | 7 Messages

17 juil. 2007, 09:35

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()

d0m
Mammouth du PHP | 1141 Messages

17 juil. 2007, 09:57

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.

ViPHP
ViPHP | 5924 Messages

17 juil. 2007, 17:40

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