-2

最初の foreach ステートメントの出力をテーブルの 1 つの列に配置し、別の foreach ステートメントの出力を別の列に配置するにはどうすればよいですか。私は何かを試しましたが、何らかの理由ですべてを1つの列にまとめました。これが私のコードです:

<table border="0" align="center">
<?php
foreach($anchors as $a) {
    $text = $a->nodeValue;
    $href = $a->getAttribute('href');
    $i++;

    if ($i > 16) {
        if (strpos($text, "by owner") === false) {
            if (strpos($text, "map") === false) {
                echo "<tr><td><a href =' ".$href." '>".$text."</a><br/></td></tr>";
            }
        }
    }
    foreach($span as $s) {
        echo "<tr><td>".$s->nodeValue."</td></tr>";
    }
}
?>
</table>
4

2 に答える 2

2

<tr></tr>行をマークします。<td></td>列をマークします。2 つの列を作成するには、<tr>反復ごとに 1 セットのタグのみを使用し、<td></td>その間に 2 セットの を使用します。

とはいえ、正確には$span何ですか?と同じ数の要素が含まれており$anchors、各行から 1 つのアイテムを表示したいですか? その場合は、コードを少し再構築する必要があります。これにはいくつかの方法がありますが、簡単な方法を次に示します。

<table border="0" align="center">
<?php

$i = 0;

foreach($anchors as $a) {
    echo "<tr>";

    $text = $a->nodeValue;
    $href = $a->getAttribute('href');

    if ($i >= 16) {
        if (strpos($text, "by owner") === false) {
            if (strpos($text, "map") === false) {
                echo "<td><a href =' ".$href." '>".$text."</a><br/></td>";
            }
        }
    } else {
       echo "<td></td>";    #output a blank cell in the first column
    }

    echo "<td>" . $span[$i]->nodeValue . "</td>";
    echo "</tr>";

    ++$i
}
?>
</table>

編集:$span配列ではなく、DOMNodeList オブジェクトのようです。これについては経験がありませんが、DOMNodelist::item関数を使用してリスト内の現在のアイテムを取得できるようです ( http://php.net/manual/en/domnodelist.item.phpを参照):

echo "<td>" . $span->item($i)->nodeValue . "</td>";

それで、それに対する私の答えのそれぞれの行を変更してみてください。

于 2013-04-23T21:27:07.403 に答える
1

データがわからないと難しいですが、おそらく次のようなものです。

   // start a table
   echo '<table>';

   // for as long as there are elements in both span and anchors
   for ($i=0; $i < $anchors->length && $i < $span->length; $i++) { 
       // start a new table row
       echo '<tr>';

       // get the current span and anchor
       $a = $anchors->item($i);
       $s = $span->item($i);

       // print them
       $text = $a->nodeValue;
       $href = $a->getAttribute('href');
       // col 1, number
       echo '<td>'.$i.'</td>';
       // col 2, anchor
       echo '<td><a href ="' .$href. '">'.$text.'</a></td>';
       // col 3, span
       echo '<td>'.$s->nodeValue.'</td>';

       // close the table row
       echo '</tr>';
    }

    // close the table
    echo '</table>';

(コードはテストされていません) 実際のデータがなければ、より具体的にすることは困難です。

これは、php に組み込まれている「現在」「次」を使用します。

途中で役立つかもしれないいくつかのヒント/コメント/補足事項:
- 単一引用符を使用したことに注意してください。
- できるだけ少ないループ (for、while、foreach) を使用するようにしてください。これらは強力なツールですが、メモリとパフォーマンスをすぐに消費する可能性があります。
- 複数の次元 (配列内の配列) で作業している場合にのみループをネストしますが、ここではそうではありません (私が思うに)
- ネストされたブロックの数を制限してみてください (ループ内の場合は内部の場合)。私は 2 レベルよりも深くならないようにしています (これはもちろん絶対的なルールではなく、良い基準です)。できない場合は、関数を作成します。
-コードにコメントしてください!私はあなたのコードを理解するのに苦労しています (そして私は生計を立てるために毎日 PHP を書いています)。コメントは時間の無駄のように見えるかもしれませんが、デバッグが大幅に楽になり、後であなた (または他の誰か) のコードを更新する際に役立ちます!

編集:
配列ではなく DOMNodeList を使用していないことに気付いたので、コードを更新しました。正常に動作し、コードがよりクリーンになるはずです。おっしゃる通り、データを見ないと大変ですね…

于 2013-04-23T21:38:27.877 に答える