[RESOLU] Appel à l'aide sur un tri de tableau

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 : [RESOLU] Appel à l'aide sur un tri de tableau

Re: Appel à l'aide sur un tri de tableau

par JP-95 » 10 nov. 2024, 10:50

Merci. Mon code ressemble beaucoup à ça (avec des lignes devenues inutiles et mises en commentaires que je vais nettoyer). Je n'ai pas voulu le poster intégralement pour ne pas alourdir les échanges.
Je serais allé bien plus vite au résultat avec cet exemple concret mais c'est pas plus mal d'avoir cherché pour mieux comprendre le principe.

Re: Appel à l'aide sur un tri de tableau

par or 1 » 10 nov. 2024, 01:07

c'est mieux avec du code, alors en voici un, qui explore un répertoire contenant des fichiers gpx.
<?php
$dir = "./gpx";
$files = scandir($dir);
$data = array();
foreach($files as $file){
  $d = array();
  $d["date"] = fileatime($dir."/".$file);
  $d["size"] = filesize($dir."/".$file);
  $d["name"] = $file;
  $data[] = $d;
}
print_r($data);
echo '\n<hr />\n';
uasort($data, 'cmpDate');
print_r($data);
echo '\n<hr />\n';
uasort($data, 'cmpSize');
print_r($data);
echo '\n<hr />\n';
uasort($data, 'cmpName');
print_r($data);

function cmpDate($a, $b) {
  $a = $a["date"];
  $b = $b["date"];
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

function cmpSize($a, $b) {
  $a = $a["size"];
  $b = $b["size"];
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

function cmpName($a, $b) {
  $a = $a["name"];
  $b = $b["name"];
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

?>

Re: Appel à l'aide sur un tri de tableau

par JP-95 » 10 nov. 2024, 00:16

Oui, c'est ce que j'ai tenté de faire,après plusieurs relectures et essais dans mon propre code ...
Comme ce qui m'intéresse est le lien vers les images et l'année associée (pour faire le tri), j'ai fait :
$data = array();
$data['année'] = ...; (je l'extrait du titre de l'image)
$data['lien'] = ...; (correct, historiquement, et contient tout le reste qui m'intéresse concernant les images)
return $data;

Dans la fonction qui appelle, je fais :
$tab = ajoute_lien($chemin_fichier, $chemin_vignette, $file);
array_push($GLOBALS['tabl_liens'], $tab);} de la valeur (array) qui a été renvoyée et je dois me retrouver avec un tableau comme ceci, associant des années et des textes donnant accès à mes images :

année-image 1, lien_image 1
année-image 2, lien_image 2
année-image 3, lien_image 3
année-image 4, lien_image 4
etc...
Après le tri par uasort, l'ordre des doublets (année, image) est normalement trié chronologiquement (avec des années qui peuvent se répéter plusieurs fois), mais j'ai eu beaucoup de mal à trouver la syntaxe pour générer ma séquence de commandes echo sur les seuls champs "lien-image N" (l'année ne m'ayant servi que comme clé de tri). J'ai du mal à appréhender les tableaux de tableaux et les tableaux associatifs mais j'ai fini par aboutir.

Merci encore Mammouth !
Reste à nettoyer mon code de tous mes essais intermédiaires et à prévoir de sortir du foreach en me fixant une limite du nombre de fichiers à afficher.

Re: Appel à l'aide sur un tri de tableau

par or 1 » 08 nov. 2024, 00:12

vous êtes allé vers le lien que j'ai donné, copié/collé l'exemple de la doc, modifié cet exemple ?

Re: Appel à l'aide sur un tri de tableau

par JP-95 » 07 nov. 2024, 23:54

Je continue à chercher ma solution... J'ai essayé d'implémenter la solution préconisée par Mammouth du PHP, mais j'ai dû rater un truc.

Si je modifie la fonction ajoute-lien () pour qu'elle retourne une variable $data de type tableau contenant les données de l'image et que la fonction trouve_images () qui l'appelle ajoute la variable retournée dans un tableau (un tableau de tableaux), je ne vois pas comment trier celui-ci sur une des variables des tableaux stockés.
N'est-il pas plus simple (et faisable) d'utiliser un tableau à deux colonnes (le critère de tri souhaité et le lien html à générer pour l'affichage) en lieu et place de mon tableau tab_liens (code html à générer) et le trier ainsi avant affichage des images ?
C'est l'idée que j'avais au départ, mais je n'ai pas réussi à la mettre en oeuvre.
A défaut de réponse, je laisse mon code tel que et je m'y remettrai quand je maîtriserai mieux le PHP.

Une dernière aide ? Merci d'avance.

Re: Appel à l'aide sur un tri de tableau

par JP-95 » 15 oct. 2024, 21:57

Je n'ai toujours pas vu comment intégrer la solution de Mammouth du PHP car il faut que je trie en même temps les liens menant aux images et vignettes et pas seulement les données IPTC. A moins de tout mettre dans le tableau et de construire mon html ailleurs. Je suis peut-être trop la t^été dans mon programme d'origine.
J'ai toutefois essayé de "mieux comprendre" en me creusant la cervelle (PHP me donne bien du mal) et je me demande s'il ne suffit pas de remplacer mon tableau initial par un tableau associatif (je n'ai jamais utilisé) , ce qui donnerait quelque chose comme ceci :

$index = fonction_date($titre) ; // fabrique un index unique basé sur la date mise dans le titre (qui servira à faire mon tri)
array_push($GLOBALS['tabl_liens'], $index => $lien);

Cela peut-il fonctionner (en espérant que ma syntaxe est correcte) ?

Merci d'avance.

Re: Appel à l'aide sur un tri de tableau

par or 1 » 12 oct. 2024, 21:53

Je n'ai pas bien compris la réponse, mais elle ne fonctionnera pas
il faut mieux comprendre alors car cela peut fonctionner sans souci.

Re: Appel à l'aide sur un tri de tableau

par JP-95 » 12 oct. 2024, 21:46

Bonjour,

Si la solution semble simple, pour un initié, je ne vois bien pas comment faire.

Mon tableau est une table de chaines html, remplie à chaque lecture d'une image. C'est donc une simple liste de textes, accessibles en séquentiel ou par index : tab_liens = array (). Il n'y a pas de clé.
Je pensais ajouter un tableau de dates, le combiner avec le premier et trier le tableau combiné, mais je ne sais pas comment ne faire les echo que sur le champ qui m'intéresse (tab_liens). J'ai essayé mais je n'y parviens pas.
En plus, ça me semble une solution compliquée et probablement plus lente en exécution.

Dois-je changer mon array global par autre chose pour faire comme vous m'indiquez (tri sur une clé, et echo sur les liens html) ?
Je sens que je suis vraiment largué.

Merci d'avance.

Re: Appel à l'aide sur un tri de tableau

par Saian » 08 oct. 2024, 14:51

Salut, si tu veux trier par date mets simplement la date plus un éventuel identifiant unique (pour éviter d'écraser un index d'une date déjà existante) en clé du tableau puis une fois le tableau rempli, trie le sur ses clés (ksort ou krsort).
Exemple de clé : 20241008.001 (année mois jour . identifiant unique)

Ensuite tu boucles sur le tableau pour faire les echo.

Re: Appel à l'aide sur un tri de tableau

par JP-95 » 07 oct. 2024, 22:00

Je n'ai pas bien compris la réponse, mais elle ne fonctionnera pas car j'ai oublié des précisions importantes dans mon texte.
La fonction ajoute-lien est appelée dans la boucle qui parcourt le répertoire des images et ne traite donc que d'une image (établit un lien entre le chemin de l'image et le texte html qui la présente en miniature), alimentant à chaque appel un tableau de niveau global. Impossible de trier ici.

Pour l'affichage, on relit le tableau global des liens pour générer le html avec "echo" :

// Gère l'affichage du tableau $GLOBALS['tabl_liens']
function affiche_galerie() {
$nb = 1;
foreach ($GLOBALS['tabl_liens'] as $val_lien) {
echo $val_lien;
$nb++;
}
}
C'est pour ça que je doutais que ma demande soit réalisable.
Idéalement, je me demande s'il est possible d'avoir un tableau global avec deux variables (les liens + les années) afin que la première fonction puisse faire un
array_push de ($lien,$année) de chaque image (quelle syntaxe, si c'est réalisable ?)
afin que la deuxième fonction affiche_galerie puisse faire d'abord le tri sur les années (avec des années qui seront forcément plusieurs fois) et après le tri n'appliquer "echo" que sur la partie liens....

Je complique peut-être les choses à force de tourner en rond ?

Re: Appel à l'aide sur un tri de tableau

par or 1 » 06 oct. 2024, 23:28

il faut modifier cette fonction pour qu'elle retourne une variable contenant les données de l'image.

$data = array();
$data['date'] = ...;
$data['titre'] = ...;
...
return $data;

le code qui a appelé cette fonction ajoute la variable retournée dans un tableau, et une des fonctions de tri permettra de trier les images selon le critère souhaité, à priori avec https://www.php.net/manual/fr/function.uasort.php
une fois le tri fait, parcourir le tableau pour afficher les données contenant dans le tableau.

Appel à l'aide sur un tri de tableau

par JP-95 » 06 oct. 2024, 22:55

Bonjour,

J'ai réalisé il y a environ 3 ans un petit site en HTML/CSS/PHP dont les pages présentent des collections d'images lues dans des répertoires et assorties d'informations complémentaires logées dans les champs IPTC. Bref, une galerie.
Ma connaissance de la programmation se limitant à de vieux langages procéduraux, j'ai "appris" ces langages au fil de la constitution du site, autant dire que j'ai bien ramé et que le résultat est encore imparfait.

Aujourd'hui, je voudrais mettre les images d'une page dans ordre déterminé sans tout reconcevoir.

Voici le code que j'avais produit à l'époque.

// Crée le lien dans le tableau global
function ajoute_lien($chemin_image, $chemin_vignette, $file) {
// Récupère la taille de la vignette sous forme HTML (width="xxx" height="yyy")
$taille_html_vignette = getimagesize($chemin_vignette);
$taille_html_vignette = $taille_html_vignette[3]; // l'index 3 récupère directement le texte à mettre dans les balises
// Je récupère les données IPTC afin d' utiliser le champ "objet" pour décrire la nature de l'oeuvre
$temp=getimagesize($chemin_image,$infojpg);
$titre=" "; $objet=" "; $statut=" "; // initialisation des variables
if (isset($infojpg["APP13"])) {
$iptc = iptcparse($infojpg["APP13"]);
$titre = (isset($iptc["2#105"][0])) ? $iptc["2#105"][0] : 'Sans titre';
$objet = (isset($iptc["2#005"][0])) ? $iptc["2#005"][0] : 'Format non précisé';
$statut = (isset($iptc["2#120"][0])) ? $iptc["2#120"][0] : ' ';
}

// Rajoute le lien vers l'image au tableau global $GLOBALS['tabl_liens'] pour pouvoir afficher en full screen
$lien = '<a href="'.$chemin_image.'">';
$lien .= '<p class="emplacement"><img class="entourage" src="'.$chemin_vignette.'" '.$taille_html_vignette.' /><br/>'.$titre.'<br>'.$objet.'<br><span style="color:#FFA500";>'.$statut.'</span></p></a>';
// complète avec les infos ITPC de l'image'

array_push($GLOBALS['tabl_liens'], $lien);
}

$lien contient le texte html qui permet d'afficher la vignette d'une image avec des éléments complémentaires, dont $titre qui est un texte contenant une année entre parenthèse, année qui n'est pas la date de la photo, mais celle de l'événement associé (c'est pour ça que c'est dans $titre) et dont je souhaite me servir comme critère de tri.
Je pense extraire l'année de $titre avec :
//Extraire l'année du titre dans $date pour faire un tri chronologique
preg_match("`([0-9]{4}`", $titre, $date);
mais ensuite je ne vois pas comment utiliser ma variable $date pour trier mon tableau de $lien, car $date n'est pas dans le tableau car elle n'est pas à cracher (echo) ensuite dans le html.

Il y a plein de fonctions "sort", mais J'ai l'impression que je ne peux pas m'en sortir.

Un avis d'expert ?

Merci d'avance.