Page 1 sur 1

[Résolu] repositionner ensemble clé/valeur dans un tableau

Posté : 22 mars 2012, 16:49
par Boro64
Bonjour,

C'est sans doute très bête, mais je bute sur ce problème depuis 2 jours:
J'ai un tableau constitué de noms de photos: la clé pour les images grand format, la valeur pour les images petits formats.
Je dois afficher les images non pas dans l'ordre chargé (trop facile) mais à partir d'une image définit comme "par défaut".
Je connais le nom de cette image (le nom est enregistré dans la BDD).
Je récupère les noms des images (scandir) dans le dossier images de l'article et je construis donc mon tableau avec ces noms (les petites d'un côté, les autres de l'autre).
La photo "par défaut" peut donc se trouver à n'importe quelle position dans le tableau.
Je voudrai donc "re-construire" le tableau, en positionnant le couple clé/valeur "par défaut" en début de tableau...et c'est là que je bloque... :oops:
J'espère que je suis clair... :mrgreen:
Auriez vous une idée, une piste, un conseil à me donner pour arriver à ce résultat?

D'avance merci pour vos réponses.

Re: repositionner ensemble clé/valeur dans un tableau

Posté : 22 mars 2012, 17:11
par AB
Tu peux mettre un champ dans ta bdd pour indiquer l'ordre d'affichage des photos...

Re: repositionner ensemble clé/valeur dans un tableau

Posté : 22 mars 2012, 17:15
par Spols
Hello,

Je te conseillerais d'utiliser un tableau à deux dimensions, ce sera plus simple.

Sinon, il faut que tu utilise la fonction usort, avec comme fonction de classement qui fasse :
récupérer en global la variable contenant ton image par défaut, voir si la première ou la deuxième occurence de ta fonction correspond à ton image par défaut.
Si ce n'est pas le cas, tu retourne 0 sinon tu retourne 1 ou -1 selon si c'est la première ou la deuxième qui correspond.

Par contre, il faudra utiliser usort ou uksort selon si c'est la petite ou la grande dont tu connais le nom.

Il y a peut être une autre solution, supprimer l'occurence qui correspond à ton image par défaut, la rajouter en dernier et inverserr ton array.

J'ai d'autre idé en tête, mais toutes aussi farfelues et à tester que les autres. Sans code on pourra pas beaucoup t'aider.

Mais utilise un tableau à deux dimensions, ce sera plus simple.

Re: repositionner ensemble clé/valeur dans un tableau

Posté : 22 mars 2012, 17:25
par Boro64
Merci à vous pour vos piste

@Spols:
Effectivement j'ai omis la partie du code concerné, je répare donc:
				$path_dossier = "img_annonces/$dossier_img";
				$path_thumb = "img_annonces/$dossier_img/pictos"; 
		$tablo_big = scandir($path_dossier);
		$filter = new RegexIterator(new ArrayIterator($tablo_big), '/jpg/');//on ne recupère que les valeurs  comprenant l'extension jpg
		$tab1 = (iterator_to_array($filter));//on construit un tableau avec uniquement les images grand format


		$tablo_min = scandir($path_thumb);
		$filter2 = new RegexIterator(new ArrayIterator($tablo_min), '/jpg/');//on ne recupère que les valeurs  comprenant l'extension jpg
		$tab2 = (iterator_to_array($filter2));//on construit un tableau avec uniquement les images petit format

$tab_final = array_combine($tab1, $tab2);//on construit un seul tableau avec les 2 précédents

			foreach ($tab_final as $img => $min_img){
				echo '<li><a class="diapos" href=" '.$path_dossier."/".$img. ' " title=" '.stripslashes($titre).' ">
								<img src=" '.$path_thumb."/" .$min_img.' " alt=" '.$ref.' " title="" />
								</a>
						</li>';
			}

Ton idée de supprimer l'occurence puis de la placer à la fin et d'inverser le tableau me semble intéressante.
D'autres idées (même farfelues! :mrgreen: )

@AB:
C'est juste aussi...je vais donc aussi envisager cette solution, mais qui m'obligerai à reprendre un code et compléter ma table; merci!

Re: repositionner ensemble clé/valeur dans un tableau

Posté : 22 mars 2012, 17:34
par Spols
Une autre idée était plutot que d'inserer à la fin et inverser, fusionner un tableaux contenant ton défaut et le tableau complet épuré de ton défaut

EDIT Je viens de lire ton code, comment es tu sur que la petite et la grande image sontcoordonnées ?
Et que sait tu à propos de ton défaut ?

Re: repositionner ensemble clé/valeur dans un tableau

Posté : 22 mars 2012, 17:50
par Boro64
Le "defaut" est enregistré dans la base à partir de la création de l'article, et est choisi par l'opérateur. Il s'agit du nom de l'image.
Ce nom est utilisé aussi bien pour la vignette que pour l'image GF (dans 2 dossiers séparés; exemple: imges_annonce/dossier_nom_annonce/les images_gf + sous_dossier thumbs/les_vignettes)
Je récupère donc à chaque fois des images (vignettes et gf qui ont le même nom...)

Re: repositionner ensemble clé/valeur dans un tableau

Posté : 22 mars 2012, 17:57
par Spols
Donc ce code devrait convenir ?
En supposant que le nom de ton image par défaut soit dans la variable $defaut
				$path_dossier = "img_annonces/$dossier_img";
				$path_thumb = "img_annonces/$dossier_img/pictos"; 
		$tablo_big = scandir($path_dossier);
		$filter = new RegexIterator(new ArrayIterator($tablo_big), '/jpg/');//on ne recupère que les valeurs  comprenant l'extension jpg
		$tab1 = (iterator_to_array($filter));//on construit un tableau avec uniquement les images grand format


		$tablo_min = scandir($path_thumb);
		$filter2 = new RegexIterator(new ArrayIterator($tablo_min), '/jpg/');//on ne recupère que les valeurs  comprenant l'extension jpg
		$tab2 = (iterator_to_array($filter2));//on construit un tableau avec uniquement les images petit format

echo '<li><a class="diapos" href=" '.$path_dossier."/".$defaut. ' " title=" '.stripslashes($titre).' ">
								<img src=" '.$path_thumb."/" .$defaut.' " alt=" '.$ref.' " title="" />
								</a>
						</li>';//echo de l'image par défaut
$key = array_search($tab1,$defaut);
unset ($tab1[$key]);unset($tab2[$key]);
			foreach ($tab as $key => $img){
				echo '<li><a class="diapos" href=" '.$path_dossier."/".$img. ' " title=" '.stripslashes($titre).' ">
								<img src=" '.$path_thumb."/" .$tab2[$key].' " alt=" '.$ref.' " title="" />
								</a>
						</li>';
			}


Re: repositionner ensemble clé/valeur dans un tableau

Posté : 22 mars 2012, 18:10
par Boro64
Merci Spols

Pendant que tu suggérai cela, j'ai "simplement" fait ceci (d'après ta 1ere suggestion, et ça fonctionne:
//récupération de l'image par défaut
			$img_defaut = trim($row_all['img_defaut']);
//construction d'un tableau
			$tab_defaut = array($img_defaut =>  $img_defaut);

			$tab_final = array_merge($tab_final, $tab_defaut); 
			$tab_final = array_reverse($tab_final);
			foreach ($tab_final as $img => $min_img){
				echo '<li><a class="diapos" href=" '.$path_dossier."/".$img. ' " title=" '.stripslashes($titre).' ">
								<img src=" '.$path_thumb."/" .$min_img.' " alt=" '.$ref.' " title="" />
								</a>
						</li>';
			}

Sachant que la doc précise pour array_merge:
Si les tableaux ont des clés en commun, la dernière valeur rencontrée écrasera l'ancienne. Pour les valeurs numériques, cela n'arrive pas, car, alors, les valeurs sont ajoutées en fin de tableau.
mais que les clés string ne le sont pas. L'ancien ensemble clé/valeur est effacé de sa position, les nouvelles valeurs ajoutés à la fin, puis un array_reverse positionnant maintenant le "defaut" en 1ere position.
Évidemment ceci n'a d’intérêt que pour 1 position; si j'avais du retenir la position désirée de chaque image, la solution suggéré par AB étant la plus simple et efficace.

Merci pour ton aide et tes conseils..même "farfelus"