2017-10-11 13 views
0

아래의 형식을 가진 HTML 표가 있습니다. 보시다시피, 첫 번째 머리글 1에는 연관된 행 1 개가 있습니다. 두 번째 머리글 2에는 행 2, 행 3이 두 개 있습니다. 헤더 3에는 행 4, 행 5, 행 6이 있습니다. 내가 태그를 얻을 수있는 파서를 사용하는 경우PHP : 간단한 HTML 돔 파서 - 헤더/고르지 않은 본문 행이있는 HTML 표를 파싱하십시오.

Header 1, Row 1 
Header 2, Row 2, Row 3 
Header 3, Row 4, Row 5, Row 6 

, 그들 모두가에 저장됩니다

<table> 
<thead> 
    <tr> 
     <th>Header 1</th> 
    </tr> 
</thead> 
<tbody> 
     <tr> 
      <td> 
       Row 1 
      </td> 
     </tr> 
</tbody> 
<thead> 
    <tr> 
     <th>Header 2</th> 
    </tr> 
</thead> 
<tbody> 
     <tr> 
      <td> 
       Row 2 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Row 3 
      </td> 
     </tr> 

</tbody> 
<thead> 
    <tr> 
     <th>Header 3</th> 
    </tr> 
</thead> 
<tbody> 
     <tr> 
      <td> 
       Row 4 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Row 5 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Row 6 
      </td> 
     </tr> 
</tbody> 

나는 다음과 같은 데이터를 얻을 수 DOM 파서 PHP는 간단한 HTML을 사용하려면 하나의 배열. foreach 루프를 수행 할 때 다른 모든 태그는 다른 배열에 저장됩니다. 루프 할 때 헤더와 행의 연관성을 어떻게 보존합니까?

+0

기본 제공 DOMDocument 인터페이스를 사용하지 않는 이유는 무엇입니까? – trincot

+0

코드를 보여주십시오. 어느 foreach가 당신을 언급하고 있습니까? – Nima

답변

1

그것을 말할 어렵다 당신이 가지고있는 것을 정확히 바꾸는 법. 하지만 다음과 같이 무언가를 사용하면 유용합니다.

//Assuming $html has been set to your html block 
$heads = $html->find('thead'); 
$result = array(); 

foreach($heads as $head){ 
    $headerText = $head->find('th')[0]->innerText; 
    $result[$headerText] = array(); 
    $rows = $head->next_sibling()->find('td'); 
    foreach($rows as $row){ 
     $result[$headerText][] = $row->innerText; 
    } 
} 

//Output 
foreach($result as $header => $rows){ 
    echo $header . ': ' . implode(',', $rows); 
} 

위의 예는 사용자가 원하는 것을 보여주는 간단한 예입니다. 그것은 아주 순진한 구현입니다. 예 : 주어진 thead은 정확하게 정확히 1 th을 가질 것이라고 가정합니다.

또한 실제로 반향 출력을 원한다면 파싱 루프에서 직접 반향하는 것이 더 효율적입니다. 필자는 출력을 화면으로 출력하는 것 이상을 원한다고 가정하므로 출력을 분리했습니다.

참고로, 네이티브 돔 파서를 사용하여 이렇게하는 것이 매우 간단합니다. 몇 가지 다른 이유로 간단한 html dom을 사용해야한다고 가정합니다.

+0

감사합니다. 완벽하게 작동했습니다. @ trincot의 솔루션도 잘 작동했습니다. – user972391

1

표준 DOMDocument 인터페이스를 사용하여이 작업을 수행 할 수 있습니다. 당신의 HTML이 변수 $html에 저장되어있는 경우, 다음을 수행하십시오

$dom = new DOMDocument(); 
$dom->loadHTML($html); 
foreach ($dom->getElementsByTagName('tr') as $row) { 
    if ($row->parentNode->tagName === 'thead') $arr[] = []; 
    $arr[count($arr)-1][] = trim($row->textContent); 
} 

위를 실행 한 후이 변수 $arr이 콘텐츠해야합니다 : 기존의 PHP 코드를 보지 않고

[ 
    ['Header 1', 'Row 1'], 
    ['Header 2', 'Row 2', 'Row 3'], 
    ['Header 3', 'Row 4', 'Row 5', 'Row 6'] 
]