[Résolu] Trier un tableau par clé ou autrement…

Bonjour,

Je souhaite pouvoir créer une boucle dans laquelle je mélangerai deux objets différents. En l’occurrence, mélanger des rubriques et des articles.

Ici, un exemple que j’ai confectionné et qui fonctionne:

#SET{mon_tableau,#ARRAY}
<BOUCLE_art(ARTICLES){id_rubrique=54}{0,10}>
    [(#SET{num,[(#TITRE|recuperer_numero|sinon{0})]})]
    #SET{champs,#ARRAY{
        id, #ID_ARTICLE,
        type, article,
        logo, #LOGO_ARTICLE,
        url, #URL_ARTICLE,
        titre, #TITRE,
        num, #RANG,
    }}
    #SET{mon_tableau, #GET{mon_tableau}|array_merge{#ARRAY{num#RANG,#GET{champs}}}}
</BOUCLE_art>

<BOUCLE_rub(RUBRIQUES){id_parent=54}{0,10}>
    [(#SET{num,[(#TITRE|recuperer_numero|sinon{0})]})]
    #SET{champs,#ARRAY{
        id, #ID_RUBRIQUE,
        type, rubrique,
        logo, #LOGO_RUBRIQUE,
        url, #URL_RUBRIQUE,
        titre, #TITRE,
        num, #RANG,
    }}
    #SET{mon_tableau, #GET{mon_tableau}|array_merge{#ARRAY{num#RANG,#GET{champs}}}}
</BOUCLE_rub>


<B_rendu>
<ul>
<BOUCLE_rendu(DATA){source table, #GET{mon_tableau}}>
    <li>#CLE - [(#VALEUR|table_valeur{num})], [(#VALEUR|table_valeur{type})], [(#VALEUR|table_valeur{titre})]</li>
</BOUCLE_rendu>
</ul>
</B_rendu>

Seulement, mon souci avec cette méthode, c’est que je ne peux pas trier par champs (titre, id, num…), ni même par clé, mon tableau pour pouvoir le passer ensuite dans la boucle DATA.

Est-ce que quelqu’un·e connaît une piste à explorer pour résoudre ce problème?

Hello

2 pistes qui peuvent t’intéresser :
https://contrib.spip.net/Melanger-et-trier-des-elements
https://contrib.spip.net/Melange-d-elements-heterogenes

J’avais eu de l’aide il y a qqs temps pour une question similaire, tu dois pouvoir t’en inspirer :
(J’ai essayé de nettoyer le code des parties inutiles pour toi mais il en reste encore)



[(#REM) 
	La grille. Merci Vincent pour l'aide : 
	http://thread.gmane.org/gmane.comp.web.spip.user/195169
]

#SET{rubs,#ARRAY}

[(#REM)
on construit un tableau rubs à 2 dimensions avec pour indices :
i1:id_rubrique
i2:id_article
pour cela, pour chaque rubrique parcourue, on crée un tableau temporaire
arts qui est ensuite affecté à l'indice courant de rubs.
]

<BOUCLE_r(RUBRIQUES){id_secteur IN 15,17,2}>
    #SET{arts,#ARRAY}
    <BOUCLE_a(ARTICLES){id_secteur}{0,5}{!par date}{masquer_accueil!=on}>
        [(#SET{arts,#GET{arts}|push{#ID_ARTICLE}})]
    </BOUCLE_a>
    [(#SET{rubs,#GET{rubs}|push{#GET{arts}}})]
</BOUCLE_r>


#SET{tablineaire,#ARRAY}
#SET{compteur,0}
#SET{id_calendrier,30}

[(#REM) on se ballade dans rubs à coup de boucle data en inversant les
indices:
en premier les rubriques et ensuite les articles.
On en profite pour incrémenter un compteur à chaque valeur rencontrée et on
agit uniquement dans le cas ou une valeur est présente (pour
gérer le cas ou un article est manquant).
Dans le cas particulier du rang 4, on insère l'id de l'article spécifique.
]

<BOUCLE_d1(DATA){liste 1,2,3,4,5}>
    #SET{v1,#VALEUR|moins{1}}
    <BOUCLE_d2(DATA){liste 1,2,3,4,5}>
        #SET{v2,#VALEUR|moins{1}}
       
		[(#SET{val,[(#GET{rubs}|table_valeur{#GET{v2}}|table_valeur{#GET{v1}})]})]
        [(#GET{val}|oui)
            [(#SET{compteur,#GET{compteur}|plus{1}})]
            [(#SET{tablineaire,[(#GET{tablineaire}|push{[(#GET{val})]})]})]
            [(#GET{compteur}=={4}|oui)               
				[(#SET{tablineaire,[(#GET{tablineaire}|push{[(#GET{id_calendrier})]})]})]
            ]
        ]
    </BOUCLE_d2>
</BOUCLE_d1>   

<div id="mur">
	
	<BOUCLE_affichage(ARTICLES){id_article IN #GET{tablineaire}}{doublons}>

		<div class="brique">

[(#REM) 
					On teste si c'est le calendrier ou un article normal

			][(#ID_ARTICLE|=={30}|?{
			
				<div class="brique-actu">
					<div>
						[<h2>(#TITRE)</h2>]
						[(#MODELE{agenda})]
						<p class="suite"><a href="#URL_ARTICLE">> Toutes les dates</a></p>
					</div>

					<div>
						<h2>La dernière newsletter</h2>
						[<p><a href="(#GET{url_newsletter})">#GET{titre_newsletter}</a></p>]
						<p class="suite">[<a href="(#INFO_URL{article,23}|ancre_url{newsletter})">> inscrivez-vous</a>]</p>				
					</div>
			</div>
			,

				[(#REM) C'est une vignette image ]			
				[(#BRIQUE_IMG|=={on}|oui)
					[(#REM) On définit la largeur de la vignette en focntion du nombre de colonnes]
					[(#BRIQUE_2COL|=={on}|?{#SET{largeur,922},#SET{largeur,454}})]
					[<div class="image">
						(#MODELE{vignette_article}{id_article=#ID_ARTICLE}{largeur_vignette=#GET{largeur}}{lien_vignette=oui}{couleur_vignette=000000})
						[<h2><a href="#URL_ARTICLE">(#TITRE_GRILLE)</a></h2>]
					</div>]
				]					
				[(#REM) Ce n'est pas une vignette image ]			
				[(#BRIQUE_IMG|=={on}|non)
					<div>
						[<h2><a href="#URL_ARTICLE">(#TITRE_GRILLE)</a></h2>]
						[(#TEXTE*|couper{470}|propre)]
						<p class="suite"><a href="#URL_ARTICLE">>>>></a></p>
					</div>]
			})]
		</div>
	</BOUCLE_affichage>
</div>

Merci à toi @J-C et à @jeanmarie . C’est finalement cette page qui m’a permis d’en arriver à mes fins: Mélange d’éléments hétérogènes - SPIP-Contrib .

1 « J'aime »