2016-09-20 3 views
0

Нужно изменить выход формата массива, сгенерированного SimpleHtmlDom. мой PHP-код. Результаты SimpleHtmlDom, что я использую это возвращение названия больницы в качестве ключа не значение ?:Формат массива с использованием SimpleHtmlDom

<?php 
require('simple_html_dom.php'); 

$table = array(); 
$html = file_get_html('https://www.miemssalert.com/chats/Default.aspx?hdRegion=3'); 

foreach($html->find('table#tblHospitals tr td.Chats') as $e) 
{ 
    //echo $e->plaintext . $e->getAttribute('style') . '<hr>'; 
$nametime = $e->plaintext; 
$color = $e->getAttribute('style'); 
$table[$nametime][$color] = true; 
} 
echo json_encode($table); 

echo '<pre>'; 
    var_dump($table); 
echo '</pre>'; 
?> 

текущих результатов массива:

array(37) { 
    ["Anne Arundel Medical Center"]=> 
    array(1) { 
    [0]=> 
    bool(true) 
    } 
    [""]=> 
    array(1) { 
    [0]=> 
    bool(true) 
    } 
    ["Baltimore Washington Medical Center"]=> 
    array(1) { 
    [0]=> 
    bool(true) 
    } 
    ["04:31"]=> 
    array(1) { 
    ["background-color:#ffff00;color:#000000;"]=> 
    bool(true) 
    } 
    ["Bon Secours Hospital"]=> 
    array(1) { 
    [0]=> 
    bool(true) 
    } 
... 

Глядя на результаты, которые будет вложен массив по имени = > Время => Color

array(37) { 
    array(1) {["Name"]=>["Anne Arundel Medical Center"]=> 
    array(2) { 
    [time]=>[""],[color]=>[""] 
    } 
    } 
    array(1) {["Name"]=>["Baltimore Washington Medical Center"]=> 
    array(2) { 
    [time]=>["04:31"],[color]=>["background-color:#ffff00;color:#000000;"] 
    } 
    } 
    array(1) {["Name"]=>["Bon Secours Hospital"]=> 
    array(2) { 
    [time]=>[""],[color]=>[""] 
    } 
    } 
... 
+0

Вы должны перекрыть элементы 'tr', а не' td.Chats'. Первым 'td' в' tr' становится имя. Затем зациклируйте оставшиеся элементы 'td' в строке, чтобы получить время и цвета. – Barmar

+0

Почему у вас есть 'array (1)' для массивов, которые имеют два элемента: 'time' и' color'.? – Barmar

+0

исправленный вопрос, результаты будут пустыми, если нет времени, см. Новое изменение - также см. Оригинальное сообщение на эту тему: http://stackoverflow.com/questions/39574672/screen-scraping-php-using-simplehtmldom – BarclayVision

ответ

1

Вы должны цикла по строкам, а не клетки, так что каждая больница соответствует элементу в массиве результатов. Получите имя больницы с первого td в строке, а время и цвета остальных - в вложенном цикле.

<?php 
require('simple_html_dom.php'); 

$table = array(); 
$html = file_get_html('https://www.miemssalert.com/chats/Default.aspx?hdRegion=3'); 

foreach($html->find('table#tblHospitals tr') as $hosp) 
    { 
     $tds = $hosp->find('td.Chats'); 
     if (!empty($tds)) { 
      $name = $tds[0]->plaintext; 
      $row = array('name' => $name, 'time' => array(), 'color' => array()); 
      foreach (array_slice($tds, 1) as $e) { 
       $time = $e->plaintext; 
       $color = $e->getAttribute('style'); 
       $row['time'][] = $time; 
       $row['color'][] = $color; 
      } 
      $table[] = $row; 
     } 
    } 

echo '<pre>'; 
var_dump($table); 
echo '</pre>'; 
+0

Это дает все нулевые значения? – BarclayVision

+0

У меня было несколько ошибок. Я также не пропустил строку заголовка. – Barmar

+0

Это отлично работает, спасибо огромное, я понятия не имел, как это сделать с SimpleHtmlDom - Большое спасибо! – BarclayVision

Смежные вопросы