Jacob
Jacob

Reputation: 207

simple html dom parsing first child into an array

Consider an html code as follow

<html>
<div class="allItems">
   <div class="Item" id="12345">
      <div class="ItemName">Tom</div>
      <div class="ItemAge">34</div>
      <div class="ItemGender">male</div>
   </div>
   <div class="Item" id="17892">
      <div class="ItemName">Dick</div>
      <div class="ItemAge">23</div>
      <div class="ItemGender">male</div>
   </div>
   <div class="Item" id="98776">
      <div class="ItemName">Harry</div>
      <div class="ItemAge">65</div>
      <div class="ItemGender">male</div>
   </div>
</div>
</html>

I am trying to parse this html document as follow:

<?php

include_once("/simple_html_dom.php");

<--a bunch of code that works until here -->

$html = str_get_html($str); //this pulls the html code fine

//this is where my array constructions does not work
foreach ($html->find('div.allItems > *') as $article) {
   $item['name'] = $html->find('div.ItemName', 0)->plaintext;
   $item['age'] = $html->find('div.ItemAge',0)->plaintext;
   $item['gender'] = $html->('div.ItemGender', 0)->plaintext;
   $articles[] = $item;
}

print_r($articles);

?>

What I would expect to get:

Array ( [0] => Array ( [name] => Tom [Age] => 34 [Gender] => male ) 
[1] => Array ( [name] => Dick [Age] => 23 [Gender] => male ) 
[2] => Array ( [name] => Harry [Age] => 65 [Gender] => male )

Instead this is What I get

Array ( [0] => Array ( [name] => Tom [Age] => 34 [Gender] => male ) 
[1] => Array ( [name] => Tom [Age] => 34 [Gender] => male ) 
[2] => Array ( [name] => Tom [Age] => 34 [Gender] => male )

My Question therefore:

How can I get the desired array?

Upvotes: 2

Views: 2276

Answers (1)

Chetan Ameta
Chetan Ameta

Reputation: 7896

You were on right track, the only think is you need to set index of div as second parameter of find function. have a look on below solution:

include_once("simple_html_dom.php");
$str = '<html>
<div class="allItems">
   <div class="Item" id="12345">
      <div class="ItemName">Tom</div>
      <div class="ItemAge">34</div>
      <div class="ItemGender">male</div>
   </div>
   <div class="Item" id="17892">
      <div class="ItemName">Dick</div>
      <div class="ItemAge">23</div>
      <div class="ItemGender">male</div>
   </div>
   <div class="Item" id="98776">
      <div class="ItemName">Harry</div>
      <div class="ItemAge">65</div>
      <div class="ItemGender">male</div>
   </div>
</div>
</html>';

$html = str_get_html($str); //this pulls the html code fine

//this is where my array constructions does not work
$i = 0;
foreach ($html->find('div.allItems > *') as $article) {
    $item['name'] = $html->find('div.ItemName', $i)->plaintext;
    $item['age'] = $html->find('div.ItemAge',$i)->plaintext;
    $item['gender'] = $html->find('div.ItemGender', $i)->plaintext;
    $articles[] = $item;
    $i++;
}

print_r($articles);

output:

Array
(
    [0] => Array
        (
            [name] => Tom
            [age] => 34
            [gender] => male
        )

    [1] => Array
        (
            [name] => Dick
            [age] => 23
            [gender] => male
        )

    [2] => Array
        (
            [name] => Harry
            [age] => 65
            [gender] => male
        )

)

Upvotes: 1

Related Questions