Bonsoir à tous !!,
Je cherche à simplifier ce code, le voici :

require_once 'simple_html_dom.php';
        // WIDE TABLE LIGUE 1  (Total but marquer et encaisser TOTAL + HOME + AWAY )
        $html = new simple_html_dom();
        $html->load_file('#lien_1'); 
        $csv = [];          
        foreach($html->find("#btable tr") as $item)
        {
            $td =$item->find("td");
            $temp = [];
            for($i=0;$i<sizeof($td); $i++)
            {
                $text = $td[$i]->text();
                $text = str_replace(",","",$text);
                $text = str_replace("&nbsp;","",$text);
                $text = str_replace(' ',"",$text);

                array_push($temp,$text);
            }
            if(sizeof($td)>0)
            {
                $csv[]=$temp;
            }
       }     

        //BUT EXACT HOME/AWAY || HOME || AWAY LIGUE 1
        $html2 = new simple_html_dom();
        $html2->load_file('#Lien_2');      
        $csv2 = [];
        foreach ($html2->find('#btable tr') as $item2){
           $td2 = $item2->find("td");
           $temp2 = [];
           for($i2=0;$i2<sizeof($td2); $i2++)
           {
               $text2 = $td2[$i2]->text();
               $text2 = str_replace(' ','',$text2);
               $text2 = str_replace('&nbsp;','',$text2);
               array_push($temp2,$text2);
           }
           if (sizeof($td2) > 1)
           {
               $csv2[] = $temp2;
           }
       }

       //TOTAL MATCH BUT LIGUE 1
       $html3 = new simple_html_dom();
        $html3->load_file('#Lien_3');      
        $csv3 = [];
        foreach ($html3->find('#btable tr') as $item3){
           $td3 = $item3->find("td");
           $temp3 = [];
           for($i3=0;$i3<sizeof($td3); $i3++)
           {
               $text3 = $td3[$i3]->text();
               $text3 = str_replace(' ','',$text3);
               $text3 = str_replace('&nbsp;','',$text3);
               array_push($temp3,$text3);
           }
           if (sizeof($td3) > 1)
           {
               $csv3[] = $temp3;
           }
       }

       //CALENDRIER LIGUE 1
       $html4 = new simple_html_dom();
        $html4->load_file('#Lien_4');      
        $csv4 = [];
        foreach ($html4->find('#btable tr') as $item4){
           $td4 = $item4->find("td");
           $temp4 = [];
           for($i4=0;$i4<sizeof($td4); $i4++)
           {
               $text4 = $td4[$i4]->text();
               $text4 = str_replace(' ','',$text4);
               $text4 = str_replace('&nbsp;','',$text4);
               $text4 = str_replace('(','',$text4);
               $text4 = str_replace(')','',$text4);
               array_push($temp4,$text4);
           }
           if (sizeof($td4) > 1)
           {
               $csv4[] = $temp4;
           }
       }

       $file = fopen("league_stats.csv","w");
        foreach($csv as $line)
        {
            fputcsv($file,$line);
        }
        foreach($csv2 as $line2)
        {
            fputcsv($file,$line2);
        }
        foreach($csv3 as $line3)
        {
            fputcsv($file,$line3);
        }
        foreach($csv4 as $line4)
        {
            fputcsv($file,$line4);
        }

Ce que je veux

Je vous ai affiché le code pour une "Ligue". Si j'ai 20 "Ligues", chaque fois j'incrémente le nom de variables manuellement et fais des copier-coller en modifiant juste les liens.
Je voudrais donc savoir si je peux faire quelqu'un chose pour raccourcir le nombre de ligne, gagner en rapidité execution et que ce soit plus lisible et rapide à faire.

Merci d'avance de votre aide !!

14 réponses


Tekuni
Auteur
Réponse acceptée

C'est j'ai trouvé ce qui allé pas. Il fallait passer de fopen() "w" à "a".
Merci beaucoup davy-beauzil pour toute l'aide que tu ma apporté.

Hello,
On peut voir que tu as 4 fois le même code. Pour optimiser ça, l´idée c´est de mettre ça dans une fonction que tu peux appeler autant de fois que tu veux.

Tekuni
Auteur

Merci de ta réponse !!

J'ai essayé de faire quelque chose, le fichier csv se creer mais il est vide. Je ne sais pas si je suis loin. Désolé je débute.

function table($lien)
        {
            $html = new simple_html_dom();
            $html->load_file($lien);
            $csv = [];
            foreach ($html->find("#btable tr") as $item) {
                $td = $item->find("td");
                $temp = [];
                for ($i = 0; $i < sizeof($td); $i++) {
                    $text = $td[$i]->text();
                    $text = str_replace(",", "", $text);
                    $text = str_replace("&nbsp;", "", $text);
                    $text = str_replace(' ', "", $text);

                    array_push($temp, $text);
                }
                if (sizeof($td) > 1) {
                    $csv[] = $temp;
                }
            }
        }
        require_once 'simple_html_dom.php';

        $lien = "https://lien.com";

        table($lien);

        $lien = "https://lien_2.com";
        table($lien);

        $file = fopen("league_stats.csv", "w");
        //Ligue 1
        foreach ($csv as $line) {
            fputcsv($file, $line);
        }

J´ai l´impression que tu déclare ta variable $csv dans ta fonction, du coup elle n´est pas reconnue en dehors de cette fonction.

Il faut que ta fonction retourne quelque chose ($csv en l´occurance). Comme ça tu donnes le résultat de ta fonction dans ton foreach final.

Petite piste d´amélioration : Si tu as 50 liens à gérer, tu vas devoir appeler 50 fois ta fonction. Tu peux transmettre un tableau de liens dans ta fonction pour l´appeler qu´une seule fois.

Tekuni
Auteur

J'ai rajouté un "return $csv;" à la fin de la fonction mais mon fichier csv est toujours vide . Une idée ?

il faut que tu recupères le résultat en faisant $csv = table($lien)

Tekuni
Auteur

Merci de tes réponses, j'ai bien amélioré le code. Est ce que je peux améliorer le fopen() car 50 liens = 50 foreach. Voici mon code pour le moment :

<?php
        require_once 'simple_html_dom.php';

        function table($lien)
        {
            $html = new simple_html_dom();
            $html->load_file($lien);
            $csv = [];
            foreach ($html->find("#btable tr") as $item) {
                $td = $item->find("td");
                $temp = [];
                for ($i = 0; $i < sizeof($td); $i++) {
                    $text = $td[$i]->text();
                    $text = str_replace(",", "", $text);
                    $text = str_replace("&nbsp;", "", $text);
                    $text = str_replace(' ', "", $text);

                    array_push($temp, $text);
                }
                if (sizeof($td) > 0) {
                    $csv[] = $temp;
                }
            }
            return $csv;
        }

        $lien = [
            '#lien1',
            '#lien2',
            '#lien3'
        ];

        $csv = table($lien[0]);      
        $csv2 = table($lien[1]);
        $csv3 = table($lien[2]);

        $file = fopen("league_stats_8.csv", "w");
        foreach ($csv as $line) {
            fputcsv($file, $line);
        }
        foreach ($csv2 as $line) {
            fputcsv($file, $line);
        }
        foreach ($csv3 as $line) {
            fputcsv($file, $line);
        }

        ?>
Tekuni
Auteur

J'ai essayé de mettre mes variables $csv dans un tableau comme ci-dessous mais cela me met 3 "array" dans mon fichier csv

        $csv = table($lien[0]);      
        $csv2 = table($lien[1]);
        $csv3 = table($lien[2]);

        $fichier = [
            $csv,
            $csv2,
            $csv3
        ];

        $file = fopen("league_stats_10.csv", "w");
        foreach ([$fichier] as $line) {
            fputcsv($file, $line);
        }

Alors dans ton code, tu as deux parties : extraction des données puis enregistrement dans un fichier csv.
Tu peux très bien intégrer la partie enregistrement dans ta fonction. Elle ne devra retourner plus rien (ou alors un boolean : true ou false pour savoir si c'est ok ou non).
De cette façon, juste en appelant ta fonction, tout se gère tout seul.

L'amélioration que je te proposais, c'était plus dans ce style là :

        function table($tableau_de_lien)
        {
           // ...
        }
        ?>

En utilisant un tableau dans ta fonction, tu peux lui passer autant de liens que tu veux en l'appelant qu'une seule fois.
Tu devras faire un foreach sur ce tableau, après à toi de voir comment tu peux gérer ça. Si t'as un soucis, hésites pas.

A la fin, tu devrais avoir que ta fonction + 1 appel à celle-ci.

Tekuni
Auteur

Salut,
bon je suppose que je n'est pas comme ca que tu me disais car cela ne fonctionne pas. Mais voila je que j'ai fais.

<?php
        require_once 'simple_html_dom.php';

        $lien = [
            'lien_1',
            'lien_2',
            'lien_3'
        ];

        function table($lien)
        {

            $html = new simple_html_dom();
            $html->load_file($lien);
            $csv = [];
            foreach ($html->find("#btable tr") as $item) {
                $td = $item->find("td");
                $temp = [];
                for ($i = 0; $i < sizeof($td); $i++) {
                    $text = $td[$i]->text();
                    $text = str_replace(",", "", $text);
                    $text = str_replace("&nbsp;", "", $text);
                    $text = str_replace(' ', "", $text);

                    array_push($temp, $text);
                }
                if (sizeof($td) > 1) {
                    $csv[] = $temp;
                }
            }
            $file = fopen("league_stats_10.csv", "w");
            foreach ($csv as $line) {
                fputcsv($file, $line);
            }

        }

        table($lien);

      ?>
Tekuni
Auteur

J'ai fais avec le foreach dans la fonction mais cela export juste le résultat du dernier lien. La je vois pas la solution une piste ?
Merci d'avance !!

require_once 'simple_html_dom.php';

        $lien = [
            'lien_1',
            'lien_2',
            'lien_3'
        ];

        function table($lien)
        {
            foreach ($lien as $lien2) {
            $html = new simple_html_dom();
                $html->load_file($lien2);
                $csv = [];
                foreach ($html->find("#btable tr") as $item) {
                    $td = $item->find("td");
                    $temp = [];
                    for ($i = 0; $i < sizeof($td); $i++) {
                        $text = $td[$i]->text();
                        $text = str_replace(",", "", $text);
                        $text = str_replace("&nbsp;", "", $text);
                        $text = str_replace(' ', "", $text);

                        array_push($temp, $text);
                    }
                    if (sizeof($td) > 1) {
                        $csv[] = $temp;
                    }
                }
                $file = fopen("resultat_1.csv", "w");
                foreach ($csv as $line) {
                    fputcsv($file, $line);
                }
            }
        }

        table($lien);

        ?>

À première vue, ton code a l´air fonctionnel.
Si avant ça fonctionnait correctement, je vois qu'une chose.
Est-ce qu´il ne faudrait pas mettre le $html->load_file($lien2) dans une variable afin de tu boucle dessus par la suite : $taVariable->find(...).

Tekuni
Auteur

si je fais ça, j'ai une erreur (Expected type 'object'. Found 'false|void'.) sur mon $teste->find(

 function table($lien)
        {
            foreach ($lien as $lien2) {
            $html = new simple_html_dom();
                $teste = $html->load_file($lien2);
                $csv = [];
                foreach ($teste->find("#btable tr") as $item) {

Je vois deux autres choses qui pourraient poser problème.

  1. Faire sizeof($temp) car on veut pousser $temp dans $csv si $temp n´est pas vide.
  2. J´ai vu que le fichier d´écriture avait changé depuis le code du début, tu vérifies bien le bon fichier ?