Parcourir un tableau multidimensionnel à l’aide de boucles

Avec la nouvelle version de spip3 il est possible de boucler sur des tableaux [1].

Un bon exemple pour récuperer des tableaux multidimensionnels est la table spip_meta. Les plugins insèrent souvent des données sous forme de tableaux multidimensionnels sérialisés [2] pour sauvegarder leur configuration.

La boucle ci-dessous va récupérer le tableau php stocké en bdd.
Ce tableau va être affecté à la variable tabMetaAuteur, puis passé en "critère" de boucle.
On effectue une boucle sur les valeurs puis une boucle récursive [3] a l’intérieur de celle-ci qui va descendre dans toute la profondeur du tableau.

[(#REM)<!-- Récupération d'un tableau en bdd-->]
<BOUCLE_recup_tableau(spip_meta){nom = champs_extras_spip_auteurs}>
    #SET{tabMetaAuteur,#VALEUR}
</BOUCLE_recup_tableau>

[(#REM)<!-- Boucle sur le tableau  -->]
<ul>
    <BOUCLE_data_tab(DATA){source table, #GET{tabMetaAuteur}}>       
        <li>#CLEF
            <B_data>
                <ul>
                    [(#REM)<!-- Boucle sur le tableau et toute sa profondeur -->]
                    <BOUCLE_data(DATA){source table, #VALEUR}{' '}>
                        <li>\[#CLE\] => #VALEUR
                            <BOUCLE_recursive_data(BOUCLE_data)>
                             </BOUCLE_recursive_data>
                        </li>      
                    </BOUCLE_data>
                </ul> 
            </B_data>
        </li>
    </BOUCLE_data_tab>
</ul>

Noter l’écriture raccourcie de la boucle de calcul :

<BOUCLE_recursive_data(BOUCLE_data)/>

Il est possible d’éviter une boucle et d’arriver au même résultat avec le code ci-dessous.

<BOUCLE_recup_tableau(spip_meta){nom = champs_extras_spip_auteurs}>
    <BOUCLE_data(DATA){source table, #VALEUR}{' '}>
        \[#CLE\] => #VALEUR
    <BOUCLE_recursive_data(BOUCLE_data)/>
    </BOUCLE_data>
</BOUCLE_recup_tableau>

Une solution encore plus rapide et d’utiliser print_r($array) de php en guise de filtre :’).

[(#GET{tabMetaAuteur}|unserialize|print_r{1})]

À noter que le tableau doit être désérialisé contrairement au critère de boucle DATA qui accepte les 2 formats.