8791 sujets

Développement web côté serveur, CMS

Bonsoir les gens ! Smiley smile


Je vous explique la situation. Je rapatrie le contenu d'un dossier contenant des fichiers XML et pour chacun d'entre-eux je récupère certaines valeurs.

$Dossier = opendir($_SERVER["DOCUMENT_ROOT"].$DossierFiches);
    while (false !== ($Fichiers = readdir($Dossier))) {
        if ($Fichiers != "." && $Fichiers != "..") {
			$FetchXML = simplexml_load_file($_SERVER["DOCUMENT_ROOT"]."/".$DossierFiches."/".$Fichiers); // Rapatrie le contenu XML du fichier
			$DateChore[$i] = date("d/m", filectime($_SERVER["DOCUMENT_ROOT"]."/".$DossierFiches."/".$Fichiers)); // Attribution d'une variable pour la date de création du fichier
			$TitreChore[$i] = htmlspecialchars($FetchXML->titre); // Attribution d'une variable pour le titre de la chorégraphie
			$MusiqueChore[$i] = htmlspecialchars($FetchXML->musique); // Attribution d'une variable pour le titre de la musique associée à la chorégraphie
            echo($Fichiers." - ".$TitreChore[$i]." - ".$MusiqueChore[$i]." - ".$DateChore[$i]."<br />\n");
        }
    }
    closedir($Dossier);


Ensuite, j'insère tout dans un tableau (HTMLement parlant). J'aimerais cependant pouvoir le trier via la valeur de $TitreChore, là où par défaut il est trié via $Fichiers.

Le problème étant que si j'insère dans mon code quelque chose du genre à :

sort($TitreChore);


Ça ne marche pas. Ou alors il mélange à peu près tout, ou m'insère des lignes en double, etc...hmm ça apparaît n'importe comment, disons.

J'imaginais régler le problème par un asort, sans succès. Et je dois avouer qu'après avoir planché sur la question pendant deux jours, la surchauffe commence doucement à s'installer.

Je me disais donc que peut-être quelqu'un pourrait m'aiguiller vers un début de solution ?


D'avance merci. Smiley smile
Modifié par SolykZ (28 Sep 2008 - 21:44)
Le problème est que tu crées un tableau ($DateChore, $TitreChore, $MusiqueChore) par type de données, donc c'est normal lors de ton tri de perdre la correspondance avec les données.

Il faut que tu mettes tes 3 données dans un seul tableau du type :

$choregraphies[$i] = array('fichier' => $fichier, 'date' => $date, 'titre' => $titre, 'musique' => $musique);

Ensuite il y a moyen de trier $choregraphies avec array_multisort()

Au passage, ne met pas de majuscule à la première lettre de tes variables, c'est un convention adopté un peu partout en développement Smiley cligne
Modifié par Surfoo (28 Sep 2008 - 22:57)
Administrateur
Bonjour,

une fois que tu as tes 3 tableaux, à un même index est associé les 3 données dans 3 tableaux différents. Si tu tries $TitreChore en conservant l'association avec les clés (asort donc), tu pourras ensuite parcourir ce tableau séquentiellement (fonctions reset(), next(), current(), ... ou plutôt each() avec list($k, $v) ?) et les autres tableaux pourront toujours être accédés par leur index ($k obtenu via list() juste avant).
$TitreChore est donc trié mais pas les 2 autres tableaux. Peu importe parce qu'on sait exactement à quelle valeur on veut accéder dans ces deux-là (on a la clé via le 1er tableau).

Dans l'exemple que tu donnes, $i n'est ni initialisé ni modifié: oubli lors du c/c?
Modifié par Felipe (29 Sep 2008 - 11:32)
Bonjour les gens. Smiley smile


Hmm...pour tout t'avouer, Felipe, je n'ai rien compris à ta réponse. Smiley sweatdrop Je la relirai quand je serai mieux réveillé, pour voir.

Disons que jusqu'à présent mon utilisation des array() était très basique...

Sinon, j'imaginais me tourner vers une solution du style celle proposée par Surfoo. Smiley smile

Je vais retourner lire un peu de doc', concernant le parcours de tableaux, et ensuite je testerai pour voir. Smiley smile


Merci à vous deux pour vos réponses, en tout cas !! Smiley smile
Hmm...je reviens à la charge, je comprends de moins en moins. Smiley ohwell

Via ceci :

<?php
	$dossier_fiches = "DLD8_9/choregraphies/fiches";
	$dossier_sons = "DLD8_9/choregraphies/sons";
	
	$dossier = opendir($_SERVER["DOCUMENT_ROOT"].$dossier_fiches);
	while (false !== ($fichiers = readdir($dossier))) {
	if ($fichiers != "." && $fichiers != "..") {
			// Rapatrie le contenu XML de chaque fichier
			$fetch = simplexml_load_file($_SERVER["DOCUMENT_ROOT"]."/".$dossier_fiches."/".$fichiers);
			
			// Stocke les données récupérées dans un tableau de lignes
			$donnees[$i] = array(
				'fichier' => $fichiers, 
				'titre' => htmlspecialchars($fetch->titre), 
				'musique' => htmlspecialchars($fetch->musique), 
				'date' => date("d/m", filectime($_SERVER["DOCUMENT_ROOT"]."/".$dossier_fiches."/".$fichiers))
			);
			
			// Affiche le contenu du tableau
			foreach ($donnees[$i] as $cle => $valeur) {
				echo($cle." : ".$valeur."<br />\n");
			}
		}
	}
    closedir($dossier);
	
?>


J'obtiens quelque chose du genre :

a écrit :
fichier : addicted_to_love.cld
titre : Addicted to Love
musique : Addicted to Love
date : 22/09
fichier : aint_going_down.cld
titre : Ain't Going Down
musique : Ain't Goin' Down
date : 25/09
fichier : badonkadonk.cld
titre : Badonkadonk
musique : Honky Tonk Badonkadonk
date : 26/09
fichier : black_coffee.cld
titre : Black Coffee
musique : Black Coffee
date : 23/09
fichier : burning_love.cld
titre : Burning Love
musique : Burning Love
date : 26/09
fichier : cannibal_stomp.cld
titre : Cannibal Stomp
musique : Sultans of Swing
date : 26/09


J'aimerais maintenant pouvoir trier ceci alphabétiquement à partir du titre. J'ai donc volontairement modifié le contenu de la balise "titre" dans un fichier XML de telle sorte à ce que je voie une différence dans le tri. J'ai essayé divers types de tri (sort, asort, ksort, rsort, ...), sans résultats concluants. A l'occasion les noms tels que "fichier", "titre", "musique et "date" se voient remplacés par des chiffres (sans doute leur position dans le tableau ?), d'autres fois j'ai droit à des erreurs fatales (quand je fais n'importe quoi en espérant avoir de la chance, un peu comme le "J'ai de la Chance" sur Google...bon j'avoue c'est pas la meilleure façon de procéder mais le désespoir amène à essayer tout et n'importe quoi, en ultime recours...), d'autres fois (notamment via rsort) le tableau est totalement inversé, ce qui rend donc la totalité du contenu de $donnees non pas en triant par date mais en affichant la ligne "date : 00/00" en premier lieu et "fichier : le_nom_du_fichier.cld" en dernière position...

Bref, c'est le chaos total, tant dans mon code que dans ma tête. Smiley ohwell
Modifié par SolykZ (29 Sep 2008 - 17:14)
hello,

Suffit d'utiliser array_multisort() comme t'as dit Surfoo, voici un petit exemple que j'ai réalisé à partir des données que tu as collé :


<?php
    $tab = array(
        array(
            'fichier'   =>  'aint_going_down.cld',
            'titre'     =>  'Aint\'t Going Down',
            'musique'   =>  'Ain\'t Goin\' Down',
            'date'      =>  '22/09'
        ),
        array(
            'fichier'   =>  'daddicted_to_love.cld',
            'titre'     =>  'dAddicted to Love',
            'musique'   =>  'dAddicted to Love',
            'date'      =>  'd22/09'
        ),
        array(
            'fichier'   =>  'caddicted_to_love.cld',
            'titre'     =>  'cAddicted to Love',
            'musique'   =>  'cAddicted to Love',
            'date'      =>  'c22/09'
        ),
        array(
            'fichier'   =>  'baddicted_to_love.cld',
            'titre'     =>  'bAddicted to Love',
            'musique'   =>  'bAddicted to Love',
            'date'      =>  'b22/09'
        ),
        array(
            'fichier'   =>  'addicted_to_love.cld',
            'titre'     =>  'Addicted to Love',
            'musique'   =>  'Addicted to Love',
            'date'      =>  '22/09'
        )
    );
    print_r($tab);
    foreach($tab as $key => $value)
        $titre[$key] = $value['titre'];
    array_multisort($titre, SORT_ASC, $tab);
    print_r($tab); 
?>


Tu charges ton tableau général et tu charges un autre tableau qui contient tout tes titres et tu dis à PHP de trier ton tableau en fonction des données de la colonne.

Je te conseille de regarder attentivement array_multisort().

Par ailleurs, il y a un autre moyen qui est de faire une association entre la clé du tableau et le titre et de réaliser un ksort() ensuite.
Modifié par thoas (29 Sep 2008 - 18:51)
Bonsoir, et merci Thoas pour ta réponse.

Le temps de comprendre comment obtenir la même structure que toi pour la création du tableau dynamique, j'ai fini par obtenir ce code :

<?php
	// Chemins d'accès
	$dossier_fiches = "DLD8_9/choregraphies/fiches";
	$dossier_sons = "DLD8_9/choregraphies/sons";
	$dossier = opendir($_SERVER["DOCUMENT_ROOT"].$dossier_fiches);
	
	// On crée le tableau qui contiendra les données à utiliser
	$donnees = array();
	while (false !== ($fichiers = readdir($dossier))) {
		if ($fichiers != "." && $fichiers != "..") {
			// Rapatrie le contenu XML de chaque fichier
			$fetch = simplexml_load_file($_SERVER["DOCUMENT_ROOT"]."/".$dossier_fiches."/".$fichiers);
			
			// Stocke les données récupérées dans un tableau de lignes
			$donnees[] = array(
				'fichier'	=> $fichiers,
				'titre'		=> htmlspecialchars($fetch->titre),
				'musique'	=> htmlspecialchars($fetch->musique),
				'date'		=> date("d/m", filectime($_SERVER["DOCUMENT_ROOT"]."/".$dossier_fiches."/".$fichiers))
			);
		}
	}
	closedir($dossier);
	
	// Affiche le contenu du tableau avant tri
	print_r($donnees);
	echo("<br />");
	
	// Crée un nouveau tableau contenant les titres des chorégraphies
	foreach ($donnees as $index => $valeur) {
		$titre[$index] = $index['titre'];
	}
	
	// Trie le tableau précédemment créé
	array_multisort($titre, SORT_ASC, $donnees);
	
	// Affiche le contenu du tableau après tri
	print_r($donnees);
	echo("<br />");
?>


Comme tu pourras le constater, j'ai fait exactement comme tu me l'as suggéré ci-dessus... Voici le résultat avant le tri :

a écrit :
Array ( [0] => Array ( Smiley fichier => a.cld Smiley titre => Z - a Smiley musique => M - a Smiley date => 22/09 ) [1] => Array ( Smiley fichier => b.cld Smiley titre => Y - b Smiley musique => N - b Smiley date => 25/09 ) [2] => Array ( Smiley fichier => c.cld Smiley titre => X - c Smiley musique => O - c Smiley date => 29/09 ) [3] => Array ( Smiley fichier => d.cld Smiley titre => W - d Smiley musique => P - d Smiley date => 29/09 ) )


Et voici le résultat...après tri :

a écrit :
Array ( [0] => Array ( Smiley fichier => a.cld Smiley titre => Z - a Smiley musique => M - a Smiley date => 22/09 ) [1] => Array ( Smiley fichier => b.cld Smiley titre => Y - b Smiley musique => N - b Smiley date => 25/09 ) [2] => Array ( Smiley fichier => c.cld Smiley titre => X - c Smiley musique => O - c Smiley date => 29/09 ) [3] => Array ( Smiley fichier => d.cld Smiley titre => W - d [musique] => P - d [date] => 29/09 ) )



J'ai bien compris ton code, en tout cas il me semble ! Alors, où me suis-je trompé ? [decu] Je commence sincèrement à perdre patience...putain c'est pourtant pas si compliqué que ça à mettre en œuvre, il me semble ! [ohwell]
Modifié par SolykZ (29 Sep 2008 - 21:08)
Mouhahahaha ! Je mérite la mort ! Smiley lol


Peut-être qu'en remplaçant :

foreach ($donnees as $index => $valeur) {
	$titre[$index] = [b]$index[/b]['titre'];
}


Par :

foreach ($donnees as $index => $valeur) {
	$titre[$index] = [b]$valeur[/b]['titre'];
}


Ça aurait fonctionné tout de suite. Smiley biggol Smiley biggol

Je vous laisse me lapider les gens, promis je ne bougerai pas d'un poil. Smiley lol

Sujet résolu, et surtout un grand merci pour votre aide, sans quoi je chercherais encore d'où vient l'erreur. Smiley smile
Modifié par SolykZ (29 Sep 2008 - 22:18)
Le principal c'est que tu aies trouvé ton problème Smiley cligne

(Bon, on te lapidera quand même.)
Je fournis même les cailloux. Smiley lol

Hmm...ça fait quand même du bien quand ça s'arrête, la recherche d'erreur. Smiley smile