Простой HTML-парсер - Foreach возвращает 14 строк вместо 7

0

У меня есть html-контент, подобный этому...

  require('simple-parser.php');    
$html = <<<EOF
    <table  id="specialTbl">
       <tbody>
          <tr>
             <td> row-1-td-1</td>
             <td> row-1-td-2</td>
             <td> row-1-td-3</td>
             <td>
                <table class="runsOn">  // Problem starts here
                   <tbody>
                      <tr>
                        <td>row-1-td-4-Child-1</td> 
                        <td>row-1-td-4-Child-2</td>               
                      </tr>               
                   </tbody>
                </table>
             </td>
             <td> row-1-td-5</td>
             <td> row-1-td-6</td>
          </tr>
          <tr>
             <td> row-2-td-1</td>
             <td> row-2-td-2</td>
             <td> row-2-td-3</td>
             <td>
                <table class="runsOn">
                   <tbody>
                      <tr>
                        <td>row-2-td-4-Child-1</td>
                        <td>row-2-td-4-Child-2</td>               
                      </tr>               
                   </tbody>
                </table>
             </td>
             <td> row-2-td-5</td>
             <td> row-2-td-6</td>
          </tr>
          <tr>
             <td> row-3-td-1</td>
             <td> row-3-td-2</td>
             <td> row-3-td-3</td>
             <td>
                <table class="runsOn">
                   <tbody>
                      <tr>
                        <td>row-3-td-4-Child-1</td>
                        <td>row-3-td-4-Child-2</td>               
                      </tr>               
                   </tbody>
                </table>
             </td>
             <td> row-3-td-5</td>
             <td> row-3-td-6</td>
          </tr>
          <tr>
             <td> row-4-td-1</td>
             <td> row-4-td-2</td>
             <td> row-4-td-3</td>
             <td>
                <table class="runsOn">
                   <tbody>
                      <tr>
                        <td>row-4-td-4-Child-1</td>
                        <td>row-4-td-4-Child-2</td>               
                      </tr>               
                   </tbody>
                </table>
             </td>
             <td> row-4-td-5</td>
             <td> row-4-td-6</td>
          </tr>
          <tr>
             <td> row-5-td-1</td>
             <td> row-5-td-2</td>
             <td> row-5-td-3</td>
             <td>
                <table class="runsOn">
                   <tbody>
                      <tr>
                        <td>row-5-td-4-Child-1</td>
                        <td>row-5-td-4-Child-2</td>               
                      </tr>               
                   </tbody>
                </table>
             </td>
             <td> row-5-td-5</td>
             <td> row-5-td-6</td>
          </tr>
          <tr>
             <td> row-6-td-1</td>
             <td> row-6-td-2</td>
             <td> row-6-td-3</td>
             <td>
                <table class="runsOn">
                   <tbody>
                      <tr>
                        <td>row-6-td-4-Child-1</td>
                        <td>row-6-td-4-Child-2</td>               
                      </tr>               
                   </tbody>
                </table>
             </td>
             <td> row-6-td-5</td>
             <td> row-6-td-6</td>
          </tr>
          <tr>
             <td> row-7-td-1</td>
             <td> row-7-td-2</td>
             <td> row-7-td-3</td>
             <td>
                <table class="runsOn">
                   <tbody>
                      <tr>
                        <td>row-7-td-4-Child-1</td>
                        <td>row-7-td-4-Child-2</td>               
                      </tr>               
                   </tbody>
                </table>
             </td>
             <td> row-7-td-5</td>
             <td> row-7-td-6</td>
          </tr>  
       </tbody>
    </table>
    EOF;

Для каждого цикла генерировать json

$html= str_get_html($html);
$table =$html->find('table#specialTbl',0) ; 
$response["response_code"] = 200;
$response["rows"]   = array();
foreach($table->find('tr') as $key=>$value) {
 $post["td1"]= trim(strip_tags($value->find('td',0)->plaintext));
 $post["td2"]= trim(strip_tags($value->find('td',1)->plaintext));
 $post["td3"]= trim(strip_tags($value->find('td',2)->plaintext));
 $post["td4"]= trim(strip_tags($value->find('td',3)->plaintext)); 
 $post["td5"]= trim(strip_tags($value->find('td',4)->plaintext));
 $post["td6"]= trim(strip_tags($value->find('td',5)->plaintext)); 
  array_push($response["rows"], $post);  
}
$json = json_encode($response);
echo $json_content;

А Json Response - это

{
"response_code":200,
"rows":[
{
"td1":"row-1-td-1",
"td2":"row-1-td-2",
"td3":"row-1-td-3",
"td4":"row-1-td-4-Child-1 row-1-td-4-Child-2",
"td5":"row-1-td-4-Child-1",
"td6":"row-1-td-4-Child-2"
},
{
"td1":"row-1-td-4-Child-1",
"td2":"row-1-td-4-Child-2",
"td3":"",
"td4":"",
"td5":"",
"td6":""
},
{
"td1":"row-2-td-1",
"td2":"row-2-td-2",
"td3":"row-2-td-3",
"td4":"row-2-td-4-Child-1 row-2-td-4-Child-2",
"td5":"row-2-td-4-Child-1",
"td6":"row-2-td-4-Child-2"
},
{
"td1":"row-2-td-4-Child-1",
"td2":"row-2-td-4-Child-2",
"td3":"",
"td4":"",
"td5":"",
"td6":""
},
{
"td1":"row-3-td-1",
"td2":"row-3-td-2",
"td3":"row-3-td-3",
"td4":"row-3-td-4-Child-1 row-3-td-4-Child-2",
"td5":"row-3-td-4-Child-1",
"td6":"row-3-td-4-Child-2"
},
{
"td1":"row-3-td-4-Child-1",
"td2":"row-3-td-4-Child-2",
"td3":"",
"td4":"",
"td5":"",
"td6":""
},
{
"td1":"row-4-td-1",
"td2":"row-4-td-2",
"td3":"row-4-td-3",
"td4":"row-4-td-4-Child-1 row-4-td-4-Child-2",
"td5":"row-4-td-4-Child-1",
"td6":"row-4-td-4-Child-2"
},
{
"td1":"row-4-td-4-Child-1",
"td2":"row-4-td-4-Child-2",
"td3":"",
"td4":"",
"td5":"",
"td6":""
},
{
"td1":"row-5-td-1",
"td2":"row-5-td-2",
"td3":"row-5-td-3",
"td4":"row-5-td-4-Child-1 row-5-td-4-Child-2",
"td5":"row-5-td-4-Child-1",
"td6":"row-5-td-4-Child-2"
},
{
"td1":"row-5-td-4-Child-1",
"td2":"row-5-td-4-Child-2",
"td3":"",
"td4":"",
"td5":"",
"td6":""
},
{
"td1":"row-6-td-1",
"td2":"row-6-td-2",
"td3":"row-6-td-3",
"td4":"row-6-td-4-Child-1 row-6-td-4-Child-2",
"td5":"row-6-td-4-Child-1",
"td6":"row-6-td-4-Child-2"
},
{
"td1":"row-6-td-4-Child-1",
"td2":"row-6-td-4-Child-2",
"td3":"",
"td4":"",
"td5":"",
"td6":""
},
{
"td1":"row-7-td-1",
"td2":"row-7-td-2",
"td3":"row-7-td-3",
"td4":"row-7-td-4-Child-1 row-7-td-4-Child-2",
"td5":"row-7-td-4-Child-1",
"td6":"row-7-td-4-Child-2"
},
{
"td1":"row-7-td-4-Child-1",
"td2":"row-7-td-4-Child-2",
"td3":"",
"td4":"",
"td5":"",
"td6":""
}
]
}

Проблема foreach с foreach. Как я могу пропустить tr внутри td. У меня 7 строк в таблице с идентификатором "specialTbl". Но for each возвращается 14 строк в json, поскольку он проходит через таблицу под названием runOn.

Как я могу избежать цикла через таблицу внутри td (4th)..?

  • 0
    Попробуй это. Удалить array_push($response["rows"], $post); из цикла foreach и поместите его после foreach
  • 0
    Вы правы ... Поставьте то же самое в ответе, я приму в качестве ответа и проголосую за него
Показать ещё 1 комментарий
Теги:
simple-html-dom

1 ответ

1
Лучший ответ

Вы должны использовать array_push вне цикла foreach.

foreach($table->find('tr') as $key=>$value) {
 $post["td1"]= trim(strip_tags($value->find('td',0)->plaintext));
 $post["td2"]= trim(strip_tags($value->find('td',1)->plaintext));
 $post["td3"]= trim(strip_tags($value->find('td',2)->plaintext));
 $post["td4"]= trim(strip_tags($value->find('td',3)->plaintext)); 
 $post["td5"]= trim(strip_tags($value->find('td',4)->plaintext));
 $post["td6"]= trim(strip_tags($value->find('td',5)->plaintext)); 
}

array_push($response["rows"], $post);  
  • 0
    @IndraKumarS Добро пожаловать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню