2016-08-04 1 views
-2

mon code HTML est LE CODE EST REPETE 16 fois:mieux avec HTML simple Dom Parser

<div class="headline_image"> 
<a ga-cat="slideshow-view" ga-action="view-1" href="mylink"><img src="http://dd4994.jpg" width="420" height="323" align="right" alt="my text "/></a> 
</div> 

JE VEUX tous les liens DHCEU et texte href aussi ce que je l'ai fait:

for ($x = 0; $x <= 15; $x++) { 
$imglink = $html->find('div[class=headline_image] img', $x)->getAttribute('src'); 
$mytext = $html->find('div[class=headline_image] img', $x)->getAttribute('alt'); 
$postlink = $html->find('div[class=headline_image] a', $x)->getAttribute('href'); 
    echo '<br/>'; 
    echo $mytext; 
    echo '<br/>'; 
    print_r($postlink); 
    echo '<br/>'; 
    } 

le code est lent des changements?

+1

Vous numérisez le dom entier à chaque fois pour chaque appel find(). Trouvez l'élément CONTAINER de tous ces divs, et vous pouvez baser votre analyse à partir de ce point. –

+0

, pourriez-vous me donner un exemple? désolé que ça doit être stupide – user2686117

Répondre

0

Vous ralentissez votre code en utilisant trop d'objets anonymes. Cela signifie que vous ne mettez pas le résultat de la fonction dans une variable, mais utilisez-la simplement "sur le pouce". Cela doit exécuter votre fonction encore et encore ralentir votre projet. Comme vous pouvez utiliser la fonction find pour renvoyer un tableau, je vous conseille de le faire avant la boucle for.

$imgarray = $html->find('div[class=headline_image] img', $x); 

De cette façon, vous exécutez $html->find exactement une fois, et non pas seize fois. Dans la boucle for, vous pouvez l'utiliser comme un tableau et travailler avec les résultats: $imgarray[$x]. Vous faites la même chose pour $anchorarray et votre code va accélérer, vous verrez.

Une autre solution utilise PHP DOM $childNodes sur le conteneur dans lequel cet élément 16 peut être trouvé (ou l'élément de corps). Cela renverra les seize éléments div dans lesquels vous pouvez naviguer en appelant $firstChild pour l'élément <a> et $ firstChild pour l'élément <img>. C'est probablement plus sûr au cas où vous souhaitez effectuer des modifications sur le site (comme l'ajout de plus de contenu au etc. final)

+0

Merci !! que penses-tu du nouveau code? – user2686117

0

Hey Daniel j'ai changé le code:

$imgarray = $html->find('div[class=headline_image] img'); 
$linkarray = $html->find('div[class=headline_image] a'); 
for ($x = 0; $x <= 15; $x++) { 

echo $imgarray[$x]->getAttribute('src'); 
    echo '<br/>'; 
    echo $imgarray[$x]->getAttribute('alt'); 
    echo '<br/>'; 
    echo $linkarray[$x]->getAttribute('href'); 
    echo '<br/>'; 

    } 
0

En général, la bonne façon itérer ressemble à ceci:

foreach($html->find('div') as $div){ 
    echo $div; 
}