Trier un tableau sur multi-dimensionnel!

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Trier un tableau sur multi-dimensionnel!

par murof » 05 mai 2009, 08:37

Bonjour,

Ca marche pas, mais j'ai trouvé une solution qui marche avec un tableau simple.

Merci a tous.

Bonne journée

par damaskinos » 04 mai 2009, 15:33

Salut

Remplace ta requête par
$sql = "SELECT classse, f.numero, identite
            FROM classe c
            JOIN fichier f ON f.numero = c.numero
           WHERE f.Numero = $numeleve
            ORDER BY classse, identite";

Enlève les quote '$numeleve' met juste $numeleve parce que ton champ f.numero est un entier.

par murof » 04 mai 2009, 13:32

C'est comme ça que je l'avais écrit, et ca ne marche pas.
A priori il la correspondance se fait pas!

par sadeq » 04 mai 2009, 13:22

Bonjour Sadeq,

Je suis en train de tester ton code, mais j'ai un probleme.

Dans le code

Code : Tout sélectionner

$sql = "SELECT classse, f.numero, identite FROM classe c JOIN fichier f ON f.numero = c.numero ORDER BY classse, identite";
j'ai ajouté

Code : Tout sélectionner

WHERE f.Numero = '$numeleve'
pour ne prendre que ce qui correspond a un individu donné (du moins je pense que c'est ce qu'il faut que je fasse)
Mais cela ne marche pas.
Je pense que f.numero correspond au champ Numero de la table fichier. Mais je ne vois pas comment dans ton code comment est associé Numero de fichier à f.numero?
A+
La requête est :
$sql = "SELECT classse, f.numero, identite
            FROM classe c
            JOIN fichier f ON f.numero = c.numero
           WHERE f.Numero = '$numeleve'
            ORDER BY classse, identite"; 

par murof » 04 mai 2009, 13:17

Je te remercie pour tout.
En postant a l'origine je pensais qu'il était possible de trier le tableau en multicritere, ce qui en plus serait peut-etre plus facile de gerer l'affichage html!
Bon après midi

par Nours312 » 04 mai 2009, 13:09

Salut ::

Je voulais faire ainsi aussi, en ajoutant sur la table classe l'identifiant idProf (retournant id de la table individu ce serait plus optimal ..

Mais n'étant pas alèse avec les jointures de tables, je ne peux te donner la requete sans la tester avant (au risque de te dire des Conn**** ...

Mais d'ici peu, un Crack (pour les jointures c'est pratique) va te donner la requete ;)

par murof » 04 mai 2009, 13:05

Bonjour Nours312,
Le problème c'est que je n'ais qu'une seule table pour les individus, et un champ (que j'ai oublié de mentionné dans mon descriptif) contenant 1 pour prof et 0 pour elèves

par Nours312 » 04 mai 2009, 12:58

salut @ tous, pour ce problème, je partirais plutot avec une structure dans le style de :

table classe :

id   annee  
01   81-82  
02   82-83  
...

tables individus
id   nom   ...
02 Dupont
03 Durant

table eleves
annee ideleves
01       02
01       03
02       03
...

table Prof 
annee Prof
01 Monprof
02 Monprof
....
ainsi avec une requete du genre :
$sql = mysql_query('SELECT annee FROM eleves WHERE ideleves = "'.$idEleveReference.'"');
$t = '';
while($r = mysql_fetch_row($sql))
    $t.=', '.$r[0];

$req = mysql_query('SELECT c.annee, i.nom, p.prof
    FROM 
      classes c,
      individus i,
      eleves e,
      prof p
   WHERE
      c.id IN ('.substr($t, 1).') &&
      c.id = e.annee &&
      c.id = p.annee &&
      i.id = e.ideleves');
tu aurais une bonnes liaison et tous les éléments .... rangés par ligne de manière suivante :

mysql_fetch_row($req) = array(annee, nomEleve, nomProf);

pour ce qui est de e.annee ou p.annee, c'est les abréviations des tables eleves et prof, autorisés par la déclaration eleves e (anciennement : eleves as e)

par murof » 04 mai 2009, 12:22

Bonjour Sadeq,

Je suis en train de tester ton code, mais j'ai un probleme.

Dans le code

Code : Tout sélectionner

$sql = "SELECT classse, f.numero, identite FROM classe c JOIN fichier f ON f.numero = c.numero ORDER BY classse, identite";
j'ai ajouté

Code : Tout sélectionner

WHERE f.Numero = '$numeleve'
pour ne prendre que ce qui correspond a un individu donné (du moins je pense que c'est ce qu'il faut que je fasse)
Mais cela ne marche pas.
Je pense que f.numero correspond au champ Numero de la table fichier. Mais je ne vois pas comment dans ton code comment est associé Numero de fichier à f.numero?
A+

par sadeq » 04 mai 2009, 11:19

Voici, un essai d'hiérarchisation des données dans un tableau multidimensionnel trié:
<pre>
<b>La base de données:</b>
--
-- Structure de la table `classe`
--
-- Création: Lun 04 Mai 2009 à 10:54
-- Dernière modification: Lun 04 Mai 2009 à 10:59
--

CREATE TABLE IF NOT EXISTS `classe` (
  `classse` char(20) NOT NULL,
  `numero` int(5) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `classe`
--

INSERT INTO `classe` (`classse`, `numero`) VALUES
('90-91', 1),
('90-91', 2),
('91-92', 3),
('91-92', 4);

-- --------------------------------------------------------

--
-- Structure de la table `fichier`
--
-- Création: Lun 04 Mai 2009 à 10:56
-- Dernière modification: Lun 04 Mai 2009 à 10:57
--

CREATE TABLE IF NOT EXISTS `fichier` (
  `numero` int(5) NOT NULL AUTO_INCREMENT,
  `identite` varchar(50) NOT NULL,
  PRIMARY KEY (`numero`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Contenu de la table `fichier`
--

INSERT INTO `fichier` (`numero`, `identite`) VALUES
(1, 'Dupont'),
(2, 'Durand'),
(3, 'Leroy'),
(4, 'Petit');
<hr />
<b>Les données stockées dans un tableau multi-dimentions:</b>
<?php
	//Lire les données de la base
	$sql = "SELECT classse, f.numero, identite
			FROM classe c
			JOIN fichier f ON f.numero = c.numero
			ORDER BY classse, identite";
	$query = mysql_db_query("test", $sql, mysql_connect("localhost", "root"));
	$table = array();
	while ($query && $row = mysql_fetch_assoc($query)){
		$classe = $row["classse"];
		$identite = $row["identite"];
		$table[$classe][$identite] = $row; // classement par classe et identite
	}
	mysql_close();
	print_r($table);
?>
</pre>
Le tri est réalisé par la requête SQL clause : ORDER BY classse, identite
Le résultat de ce programme est ce que affiche l'instruction : print_r($table):

Code : Tout sélectionner

Array ( [90-91] => Array ( [Dupont] => Array ( [classse] => 90-91 [numero] => 1 [identite] => Dupont ) [Durand] => Array ( [classse] => 90-91 [numero] => 2 [identite] => Durand ) ) [91-92] => Array ( [Leroy] => Array ( [classse] => 91-92 [numero] => 3 [identite] => Leroy ) [Petit] => Array ( [classse] => 91-92 [numero] => 4 [identite] => Petit ) ) )

par murof » 04 mai 2009, 09:58

Bonjour,
Je reprend le fil:
Voici mes structures de table.

Table Classe

Code : Tout sélectionner

`classse` char(20) character set latin1 collate latin1_general_ci NOT NULL, `numero` int(5) unsigned NOT NULL,
Table Fichier

Code : Tout sélectionner

`Numero` int(5) unsigned NOT NULL auto_increment, `Identite` varchar(50) character set utf8 NOT NULL, PRIMARY KEY (`Numero`)
Les relations:

Classe 1,n => / <=1,n Fichier

Pour Nours312, voici le print_r en fin de boucle

Code : Tout sélectionner

Array ( [0] => Array ( [Classe] => 85-86 ) ) Array ( [0] => Array ( [Classe] => 85-86 ) [1] => Array ( [Classe] => 86-87 ) ) Array ( [0] => Array ( [Classe] => 85-86 ) [1] => Array ( [Classe] => 86-87 ) [2] => Array ( [Classe] => 87-88 ) ) Array ( [0] => Array ( [Classe] => 85-86 ) [1] => Array ( [Classe] => 86-87 ) [2] => Array ( [Classe] => 87-88 ) [3] => Array ( [Classe] => 88-89 ) ) Array ( [0] => Array ( [Classe] => 85-86 ) [1] => Array ( [Classe] => 86-87 ) [2] => Array ( [Classe] => 87-88 ) [3] => Array ( [Classe] => 88-89 ) [4] => Array ( [Classe] => 90-91 ) ) Array ( [0] => Array ( [Classe] => 85-86 ) [1] => Array ( [Classe] => 86-87 ) [2] => Array ( [Classe] => 87-88 ) [3] => Array ( [Classe] => 88-89 ) [4] => Array ( [Classe] => 90-91 ) [5] => Array ( [Classe] => 91-92 ) ) . . etc . .
Si ca peut vous aider

A+

par murof » 01 mai 2009, 08:37

OK, je vais vous faire ca, mais je ne sais pas si ce sera aujourd'hui.
Bon Week-End

par sadeq » 30 avr. 2009, 21:05

Peux-tu nous donner un récap simplifié sur la structure et les relations de tes tables avec la liste des champs ? à ce moment on peut te préconiser une structure hiérarchique adaptée à ton tableau.

par Nours312 » 30 avr. 2009, 20:12

je ne vois pas pourquoi tu mets dans la clé du premier niveau suivant l'année, le nom ....

ce n'est pas pratique ...

dans l'exemple que je t'ai donné, je t'ai dit de mettre trois données directement en dessous de l'année,
1. si cette année là, il été prof ,
2. le nom du prof cet année là,
3. la liste des élèves cette année là ...


les noms sont-ils ceux des élèves ou des profs ?

et fait ton print_r() après la boucle de conception, ce sera plus lisible ...


peux tu le faire ??

@+

par murof » 30 avr. 2009, 18:57

J'ai mis ca:

Code : Tout sélectionner

$tab[$annee][$row_Recordrecid['Identite']]['etat'] = '1' | '0'; if ($row_Recordrecid['Profs'] == 1) { $tab[$annee][$row_Recordrecid['Identite']]['1'] = $row_Recordrecid['Identite'] ;// celui du prof } else { $tab[$annee][$row_Recordrecid['Identite']]['0'] = $row_Recordrecid['Identite'] ; }
ca me donne ce bout de code:

Code : Tout sélectionner

Array ( [85-86] => Array ( [Regine GOURDON] => Array ( [etat] => 1 [1] => Regine GOURDON ) ) ) Array ( [85-86] => Array ( [Regine GOURDON] => Array ( [etat] => 1 [1] => Regine GOURDON ) [Mme HULIN] => Array ( [etat] => 1 [0] => Mme HULIN ) ) ) Array ( [85-86] => Array ( [Regine GOURDON] => Array ( [etat] => 1 [1] => Regine GOURDON ) [Mme HULIN] => Array ( [etat] => 1 [0] => Mme HULIN )
Mais dans l'affichage du foreach ca donne rpas ce que je veux