Trier un tableau sur multi-dimensionnel!

Eléphanteau du PHP | 28 Messages

01 mai 2009, 08:37

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

Eléphanteau du PHP | 28 Messages

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+

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

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 ) ) )
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 28 Messages

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+

Mammouth du PHP | 661 Messages

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)

Eléphanteau du PHP | 28 Messages

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

Mammouth du PHP | 661 Messages

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

Eléphanteau du PHP | 28 Messages

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

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"; 
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 28 Messages

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!

Eléphant du PHP | 288 Messages

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.

Eléphanteau du PHP | 28 Messages

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