[RESOLU] Fonction récursive : Help

Mammouth du PHP | 881 Messages

07 janv. 2016, 09:54

Tiens, je pensais à cela, afin de « nettoyer » un peu tes résultats, peut-être pourrais-tu simplement faire un array_flip. Tes urls seraient automatiquement réduits à une occurrence et la valeur te fournirait la profondeur de la-dite adresse.
Soyez artisans de paix

Eléphanteau du PHP | 48 Messages

07 janv. 2016, 12:23

J'ai essayé, ça me donne rien d'intéressant, que ce que j'ai déjà.

Mammouth du PHP | 881 Messages

07 janv. 2016, 16:29

Une chose de vérifiée: https://formatrice.wordpress.com/2008/0 ... parcourir/
On ne peut faire autrement, pour connaître tout le tableau et ses dimensions (inégales ici), que de le parcourir récursivement.

As-tu vérifié si ta fonction in_multi_array est appelée ?

Et si ton tableau d'URL était structuré ainsi,

Code : Tout sélectionner

function in_multi_array($value, $array, $prof=0) { foreach ($array as $key => $item) { if (!is_array($item)) { if ($item == $value) return true; } else { if (in_array($value, $item)) return true; else if (in_multi_array($value, $item, ($prof+1))) return true; } } return false; }

Tu pourrais alors avoir un tableau beaucoup plus facile à gérer s'il était ainsi

Code : Tout sélectionner

Array ( [0] => array(0, 'http://www.jscourses.com') [1] => array(1, 'http://www.jscourses.com/') [2] => array(1, 'http://www.jscourses.com/services') [3] => array(2, 'http://www.jscourses.com/tarifs') [4] => array(2, 'http://www.jscourses.com/reserver') [5] => array(0, 'http://www.jscourses.com/gare-de-lyon') [6] => array(0, 'http://www.jscourses.com/gare-de-lyon/taxi-moto-gare-de-lyon')
où la première valeur serait la profondeur. T'aurais alors un tableau presque plat, conservant l'information essentielle.
Soyez artisans de paix

Eléphanteau du PHP | 48 Messages

07 janv. 2016, 17:00

C'est une bonne idée, mais j'ai besoin de savoir à quel lien appartiennent tels liens.

Peut-être :

Code : Tout sélectionner

Array ( [0] => array(0, 'http://www.jscourses.com') [1] => array(1, 'http://www.jscourses.com', 'http://www.jscourses.com/') [2] => array(1, 'http://www.jscourses.com', 'http://www.jscourses.com/services') [3] => array(2, 'http://www.jscourses.com/services', 'http://www.jscourses.com/tarifs') [4] => array(2, 'http://www.jscourses.com/services', 'http://www.jscourses.com/reserver') [5] => array(0, 'http://www.jscourses.com/gare-de-lyon') [6] => array(0, 'http://www.jscourses.com/gare-de-lyon/taxi-moto-gare-de-lyon')
Mais par contre, la fonction in_multi_array ne modifie pas mon tableau, elle vérifie uniquement si l'url en cours est déjà dans mon tableau ou pas (mais ça ne fonctionne pas je crois, surement à cause de ma structure du tableau actuel...).

Mammouth du PHP | 881 Messages

07 janv. 2016, 19:04

À ces conditions, tu peux te permettre de redéfinir complètement ta fonction in_multi_array ou à détruire
Je crois - parce qu'un tableau créé par PHP est obligatoirement de taille finie - que tu n'auras pas de problème de cycle infini avec tes fonctions actuelles (sauf in_multi_array qui sera à réécrire ou détruire)

Tandis que tu y es, tu pourrais te mettre des indices faciles à travailler, ça produirait un tableau comme

Code : Tout sélectionner

Array ( [0] => array('niv' => 0, 'adrs' => 'http://www.jscourses.com', 'orig' => '') [1] => array('niv' => 1, 'adrs' => 'http://www.jscourses.com', 'orig' => 'http://www.jscourses.com/') [2] => array('niv' => 1, 'adrs' => 'http://www.jscourses.com', 'orig' => 'http://www.jscourses.com/services') [3] => array('niv' => 2, 'adrs' => 'http://www.jscourses.com/services', 'orig' => 'http://www.jscourses.com/tarifs') [4] => array('niv' => 2, 'adrs' => 'http://www.jscourses.com/services', 'orig' => 'http://www.jscourses.com/reserver') [5] => array('niv' => 0, 'adrs' => 'http://www.jscourses.com/gare-de-lyon'. 'orig' => '') [6] => array('niv' => 0, 'adrs' => 'http://www.jscourses.com/gare-de-lyon/taxi-moto-gare-de-lyon','orig' => '')
Voyons voir si ça marche:

Code : Tout sélectionner

function crawl($url, &$urls, $limite, $prof=0, $orig='') //un changement apporté ici { $code_brute = crawlcurl($url); $doc = new DOMDocument(); $doc->loadHTML($code_brute); $balise_a = $doc->getElementsByTagName('a'); foreach($balise_a as $balise) { $href = $balise->getAttribute('href'); // if( !in_multi_array($href, $urls) && strstr($href, racine($url)) && !strstr($href, 'pdf') ) // Nouveau centre de traitement if (is_array($href)) { foreach ($href as $ind => $val ) { crawl($val, $urls, $limite, ($prof+1), $orig); } } else { $urls[] = array('niv' => $niv, 'adrs' =>$href, 'orig' =>$orig); } } return $urls; }
Soyez artisans de paix

Eléphanteau du PHP | 48 Messages

07 janv. 2016, 20:51

Merci pour le temps que tu m'accorde, voici le résultat :

Code : Tout sélectionner

Array ( [0] => Array ( [niv] => [adrs] => tel:0123456789 [orig] => ) [1] => Array ( [niv] => [adrs] => http://www.jscourses.com [orig] => ) [2] => Array ( [niv] => [adrs] => http://www.jscourses.com/ [orig] => ) [3] => Array ( [niv] => [adrs] => http://www.jscourses.com/services [orig] => ) [4] => Array ( [niv] => [adrs] => http://www.jscourses.com/tarifs [orig] => ) [5] => Array ( [niv] => [adrs] => http://www.jscourses.com/reserver [orig] => ) [6] => Array ( [niv] => [adrs] => # [orig] => ) [7] => Array ( [niv] => [adrs] => # [orig] => ) [8] => Array ( [niv] => [adrs] => http://www.jscourses.com/reserver [orig] => ) [9] => Array ( [niv] => [adrs] => http://www.jscourses.com/gare-de-lyon [orig] => ) [10] => Array ( [niv] => [adrs] => http://www.jscourses.com/gare-de-lyon/taxi-moto-gare-de-lyon [orig] => ) [11] => Array ( [niv] => [adrs] => [orig] => ) [12] => Array ( [niv] => [adrs] => http://www.foxinteractive.fr [orig] => ) )
Tout est bien rangé, mais le script ne va pas en profondeur, il scanne que la première page (niveau 0), et ne prend pas en compte le niveau de profondeur demandé.

Eléphanteau du PHP | 48 Messages

07 janv. 2016, 21:07

Je crois que j'ai réussi (plus ou moins) :

Code : Tout sélectionner

function crawl($url, $limite) { $code_brute = crawlcurl($url); $doc = new DOMDocument(); $doc->loadHTML($code_brute); $balise_a = $doc->getElementsByTagName('a'); foreach($balise_a as $balise) { $href = $balise->getAttribute('href'); if( !in_multi_array($href, $urls) && strstr($href, racine($url)) && !strstr($href, 'pdf') ) { $ecurls[] = $href; $urls[] = $href; } } for($i = 0; $i < count($ecurls); $i++) { //echo $i . ' - ' . $urls[$i] . '<br>'; if( $limite > 0 ) { $urls[] = crawl($ecurls[$i], ($limite - 1)); } } $limite = ($limite - 1); return $urls; }

Mammouth du PHP | 881 Messages

07 janv. 2016, 21:55

Intéressant!
Fais les tests et reviens-nous .
Soyez artisans de paix

Eléphanteau du PHP | 48 Messages

07 janv. 2016, 22:25

Et voilà c'est parfait !

Code : Tout sélectionner

function crawl($url, $limite=0, $lvl=0) { $code_brute = crawlcurl($url); $doc = new DOMDocument(); $doc->loadHTML($code_brute); $balise_a = $doc->getElementsByTagName('a'); foreach($balise_a as $balise) { $href = $balise->getAttribute('href'); if( !in_multi_array($href, $urls) && strstr($href, racine($url)) && !strstr($href, 'pdf') ) { $ecurls[] = $href; $urls[] = array('lvl' => "$lvl", 'parent' => $url, 'url' => $href); } } for($i = 0; $i < count($ecurls); $i++) { if( $limite > 0 ) { $crawl = crawl($ecurls[$i], ($limite - 1), ($lvl + 1)); $urls = array_merge($urls, $crawl); } } $limite = ($limite - 1); return $urls; }
Fonctionne parfaitement, enfin !
Merci de ton aide en tout cas. :) =D>

Mammouth du PHP | 881 Messages

08 janv. 2016, 00:57

Félicitations.

Indique [Résolu] dans ton titre.
Soyez artisans de paix