Bonjour,

Voilà je rencontre un petit problème avec mon code.

Ce que je veux

Je veux transformer la fonction main() en récursive pour ne plus faire x foreach :

function main(array $array)
{
    $head1 = "<td bgcolor='#dbdddd'>Mois</td>";
    $head2 = "<td bgcolor='#dbdddd'></td>";
    $head3 = "<td bgcolor='#dbdddd'></td>";
    $head4 = "<td bgcolor='#dbdddd'></td>";

    // Construction du header
    foreach ($array[0] as $key1 => $value1) {
        $counter1 = 0;
        if (!is_array($value1) || count($value1) == 0) {
            $counter1++;
            $head2 .= "<td bgcolor='#dbdddd'></td>";
            $head3 .= "<td bgcolor='#dbdddd'></td>";
            $head4 .= "<td bgcolor='#dbdddd'></td>";
        }
        foreach ($value1 as $key2 => $value2) {
            $counter2 = 0;
            if (!is_array($value2) || count($value2) == 0) {
                $counter1++;
                $counter2++;
                $head3 .= "<td bgcolor='#dbdddd'></td>";
                $head4 .= "<td bgcolor='#dbdddd'></td>";
            }
            foreach ($value2 as $key3 => $value3) {
                $counter3 = 0;
                if (!is_array($value3) || count($value3) == 0) {
                    $counter1++;
                    $counter2++;
                    $counter3++;
                    $head4 .= "<td bgcolor='#dbdddd'></td>";
                }
                foreach ($value3 as $key4 => $value4) {
                    $counter1++;
                    $counter2++;
                    $counter3++;
                    $head4 .= "<td bgcolor='#dbdddd'>$key4</td>";
                }
                $head3 .= "<td bgcolor='#dbdddd' colspan=\"$counter3\">$key3</td>";
            }
            $head2 .= "<td bgcolor='#dbdddd' colspan=\"$counter2\">$key2</td>";
        }
        $head1 .= "<td bgcolor='#dbdddd' colspan=\"$counter1\">$key1</td>";
    }

    $html = "<table border=1>";
    $html .= "<tr>";
    $html .= $head1;
    $html .= "</tr>";
    $html .= "<tr>";
    $html .= $head2;
    $html .= "</tr>";
    $html .= "<tr>";
    $html .= $head3;
    $html .= "</tr>";
    $html .= "<tr>";
    $html .= $head4;
    $html .= "</tr>";

    // Remplissage du tableau avec les données
    foreach ($array as $key1 => $value1) {
        $html .= "<tr><td bgcolor='#dbdddd'>$key1</td>";
        foreach ($value1 as $key2 => $value2) {
            if (!is_array($value2)) {
                $html .= "<td>" . formatNumber($value2) . "</td>";
            }
            if (count($value2) == 0) {
                $html .= "<td>0</td>";
            }
            foreach ($value2 as $key3 => $value3) {
                if (!is_array($value3)) {
                    $html .= "<td>" . formatNumber($value3) . "</td>";
                }
                if (count($value3) == 0) {
                    $html .= "<td>0</td>";
                }
                foreach ($value3 as $key4 => $value4) {
                    if (!is_array($value4)) {
                        $html .= "<td>" . formatNumber($value4) . "</td>";
                    }
                    if (count($value4) == 0) {
                        $html .= "<td>0</td>";
                    }
                    foreach ($value4 as $key5 => $value5) {
                        $html .= "<td>" . formatNumber($value5) . "</td>";
                    }
                }
            }
        }
        $html .= "</tr>";
    }
    $html .= "</table>";
    echo $html;
}

Ce que je fais

J'ai cette méthode pour parcourir les données :

function recursiveData(array $array)
{
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            recursiveData($value);
        } else {
            echo $value . '<br>';
        }
    }
}

Mais je ne vois pas comment afficher ça dans un élément <table>car lorsque je vais boucler de nouveau dans la méthode recursiveData, je vais de nouveau créer un élément <table>

7 réponses


Salut @Pierrot01.

Ce n'est pas du tout ce que je recherche, actuellement mon tableau a une profondeur de 4, je suis obligé d'utiliser une fonction récursive car demain mon tableau peut avoir une profondeur de 5, 7, 8...

Merci quand même pour ton message.

c'est quoi la profondeur d'un tableau ???????

@pluche :D :D

Pierre

Bonjour.
Avant de vouloir faire des choses complexes en PHP, tu devrais sérieusement revoir tes bases en matière de HTML.
Car pour commencer, les en-têtes d'un tableau doivent se situer dans les balises thead et pour le contenu du tableau doit se situer dans la balise tbody.
Ensuite, les cellules d'un en-tête d'un tableau, ce ne sont pas des balises td, mais des balises th.
Ceci était pour le HTML, maintenant concernant le PHP.
Dans le code, tu commences par faire une condition :

if (!is_array($value1) || count($value1) == 0) {

Alors que plus bas tu veux faire une boucle sur une variable qui ne serait pas un tableau, c'est totalement infaisable de faire une boucle sur une variable qui n'est pas un tableau.
Et tu continues comme ça dans toutes les autres boucles.
Tu parles d'un tableau qui aurait actuellement une profondeur de 4 et qui plus tard pourrait bien en avoir le double, sauf que dès la première boucle dans ta fonction, tu pourrais à en lire le code que la profondeur ne dépasse pas 1.
Sinon, tu ne crois pas qu'il serait plus logique à la fin de la fonction de retourner la variable $html au lieu de faire un echo sur celle-ci ?

Salut @Lartak, merci pour ton message.

Dans un premier temps, tu remarqueras que ce problème a été publié dans le forum PHP et non HTML, la mise en forme ici n'est que la finalité du problème que j'ai posé (et donc ce n'est pas le principal).

Le problème que tu soulèves n'en est pas un dans ce cas présent. En effet je connais la structure de mon tableau, c'est la raison pour laquelle je fais une boucle sur $value1, $value2et $value3.
D'où ma question de transformer ce code en récursif et en utilisant la fonction is_array() (très certainement) pour vérifier si le tableau à une profondeur suplémentaire.

Enfin pour le return ou le echo à la fin, c'est disuctable. Sois je fais un return $html et lorsque j'appelle ma fonction je fais echo maFonction(), soit je fais un echo $html et lorsque j'appelle ma fonction je fais maFonction().

haha :D :D
y en a qui cherche des excuses à leurs conchonceté :D :D

@pluche

Pierre

Je t'invite à parcourir les vidéos de Grafikart, notamment sur "la POO en PHP".
Plusieurs vidéos te donneront la solution que tu recherches :
La structure : https://www.grafikart.fr/tutoriels/tp-structure-565 (notamment vers la 11ème minutes. Mais je t'invite à la faire entièrement)
Connexion à la Base de Données : https://www.grafikart.fr/tutoriels/tp-database-566 pour la gestions des données
MVC : https://www.grafikart.fr/tutoriels/mvc-model-view-controller-574 (Mais il te faudra regarder les vidéos précédentes pour comprendre le fonctionnement de cette méthode d'organisation.

Pourquoi je te conseille cela : Parce que ton code est plus procédurale que Orienté Objet.
La POO te fera prendre de la hauteur sur tes méthodes de programmation et également te facilitera l'évolution et la maintenance des applications que tu développeras.

Bon courage