2008-11-05 7 views
2

방문한 페이지 대 방문한 페이지를 보여주는 HTML 표를 만들어야합니다./또는 foreach 루프를 사용하는 것이 klunky 인 것처럼 보이지만 나는 더 나은 것을 생각할 수 없습니다. 저는 PHP를 사용하고 있습니다. 그러나 이것은 언어에 무관심하다고 생각합니다.루프가 테이블을 만드는 가장 좋은 방법입니까?

답변

4

... 루프의 일종을 사용합니다. 당신이 불쾌한 코드없이 '순수'유지하려고 할 경우

그러나, 적어도 수행 할 수 있습니다

$tableformat = '<table><thead>%s</thead><tbody>%s</tbody></table>'; 
$rowformat = '<tr>%s</tr>'; 
$cellformat = '<td>%s</td>'; 

$hdata = ''; 
foreach($data[0] as $cellname => $cellvalue) 
{ 
    $hdata .= sprintf($cellformat, $cellname); 
} 
$hdata = sprintf($rowformat, $hdata); 
$rdata = ""; 
foreach($data as $rownum => $rowvalue) 
{ 
    $row = ""; 
    foreach($rowvalue as $colname => $colvalue) 
    { 
     $row .= sprintf($cellformat, $colvalue); 
    } 
    $rdata .= sprintf($rowformat,$row); 
} 
return sprintf($tableformat, $hdata, $rdata); 

적어도 그런 식으로는 어느 정도 유지 관리 될 수 있습니다. 불완전한 문자열에 대해 걱정하지 않아도됩니다.

은 또한 오히려 간결하면서, 아마도 결국 뜨거운 물을 조금에서 당신을 얻을 것이다 어떤

$hdata = "<tr><td>" . implode("</td><td>", array_keys($data[0])) . "</td></tr>"; 
    $rdata .= "<tr><td>" . implode("</td><td>", $rowvalue) . "</td></tr>"; 

와 그 코드의 일부를 subsitutue 수 있으며 재 코딩이 필요합니다. (내부적으로 내부적으로 루프가 실행되므로 내부 손실이 발생합니다). 당신이 추가 함수 호출의 오버 헤드를 괜찮다면

이 너무 많은 네거티브없이 더 간결한 코드를 만들 수있는 (그리고 여전히 루프를 실행) :

$tableformat = '<table><thead>%s</thead><tbody>%s</tbody></table>'; 
$rowformat = '<tr>%s</tr>'; 
$cellformat = '<td>%s</td>'; 

function tr($cells) 
{ 
    $o = ""; 
    foreach($cells as $i => $v) 
    { 
     $o .= sprintf($cellformat, $v); 
    } 
    return sprintf($rowformat, $o); 
} 


return sprintf($tableformat, 
       tr(array_keys($data[0])), 
       implode("", array_map('tr', $data))); 

을하지만 조심, 읽기 어려운 이잖아, 그리고 언젠가는 당신이 그것을 lisp로 깨울 것입니다.

+0

정말 좋아합니다. 그것들은 무작위 문자열을 가진 루프보다 훨씬 깔끔한 코드를 만듭니다. –

+0

은 HTML 내에서 mangling 코드보다 (IMNSHO) PHP 코드 내에서 HTML을 mangle합니다. – Javier

+0

PHP는 그대로 망가져 있습니다. 당신은 훨씬 더 악화시킬 수 없습니다. IMO. –

4

글쎄, 여러 행이 있고 각 행에서 비슷한 형식의 데이터가있는 경우 루프를 사용하지 않는 테이블을 만드는 방법을 생각할 수 없습니다. 그 유형의 것은 기본적으로 어떤 루프가 만들어 졌는지입니다.

작성하려는 테이블에 대해 자세히 설명해 주시면 더 나은 방법을 공식화 할 수 있습니다.

3

다음 테이블의 데이터가 동적 인 경우 아마 훨씬 더 생각

2

당신의 코드에서 행과 열의 수를 하드 코딩 할 필요가 당신은 루프의 일부 종류의 사용하지 않는 경우 그럼 당신은 루프를 사용해야합니다. 테이블을 생성하는 구성 요소를 얻더라도 내부적으로 루프를 사용합니다.

1

"최상의"정의에 따라 다릅니다. FOR 루프는 잘 작동합니다. 저는 PHP 프로그래머가 아니지만, .NET에서는 테이블 HTML을 선언하는 데 사용할 수있는 일종의 템플릿 인 Repeater를 사용할 수 있습니다. 그것은 머리말, 꼬리말 및 각 품목을위한 템플렛이있다. 데이터 소스를 repeater에 바인드하면 FOR 루프를 사용하는 것보다 좀 더 우아하게 테이블 HTML이 생성됩니다. 나는 PHP에서 동등한 템플리트가 있다고 생각한다. 결국

는하지만, 심지어 리피터 구현, 그것은 여전히 ​​기계 수준에서 일어날하지 않을 경우 루프를 방지하는 것은, 아마도 수 없습니다

2

PHP 용 템플릿 엔진 Smarty을 적극 권장합니다. 이렇게하면 Smarty 구문을 사용하여 테이블 (및 피할 수없는 관련 루프)을 템플릿으로 옮길 수 있으므로 비즈니스 로직에서 더 명확하고 분리됩니다. 예제의 거의 모든 코드를 HTML 스 니펫의 몇 ​​가지 간단한 태그로 바꿀 수 있습니다. Smarty 페이지에서 테이블 사용에 대한 예를 보려면 충돌 과정을 확인하십시오.

-1

일반적으로 PHP에서는 루프와 implode을 사용합니다. 기능적 프로그래밍을 지원하는 언어에서 나는 그것을 다르게 할 것이다.

function render_table($data) { 
    $html = '<table>'; 
    $tr = array(); 
    foreach (array_keys($data[0]) as $key) { 
    $tr[] = '<th>' . htmlspecialchars($key) . '</th>'; 
    } 
    $html .= "\n" . '<thead>' . "\n" . '<tr>' . "\n" . implode("\n", $tr) . '</tr>' . '</thead>'; 
    $tbody = array(); 
    foreach ($data as $row) { 
    $tr = array(); 
    foreach ($row as $value) { 
     $tr[] = '<td>' . htmlspecialchars($value) . '</td>'; 
    } 
    $tbody[] = '<tr>' . "\n" . implode("\n", $tr) . '</tr>'; 
    } 
    $html .= "\n" . '<tbody>' . "\n" . implode("\n", $tbody) . '</tbody>'; 
    $html .= '</table>'; 
    return $html; 
} 
0

왜 루프를 방지 하시겠습니까? 항목 집합이 있고 각 항목을 표시하려는 경우 분명히 집합을 반복하면 확실한 해결책이 될 것입니다.

모델을보기와 분리하거나 가독성이 좋은 코드를 작성하려는 경우 유용합니다. 그러나 루프는 본질적으로 나쁘지 않습니다.

+0

아니, 그들은 나쁘지 않다. 그러나 방대한 데이터 세트를 가지고 이상한 일을 할 때 루프는 코드를 읽을 수있게 만드는 데 도움이되지 않습니다. –

관련 문제