【问题标题】:How to put to style two foreach statements output PHP如何设置样式两个 foreach 语句输出 PHP
【发布时间】:2017-10-05 05:13:17
【问题描述】:

如何将第一个 foreach 语句的输出放在表的一列中,而将另一个 foreach 语句的输出放在另一列中。我尝试了一些东西,但出于某种原因,它把它全部放在了一个列中。这是我的代码:

<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>

【问题讨论】:

  • 定义“列”。也请正确缩进你的代码。
  • 我编辑了你的格式,但把右括号留给第一个被注释掉的if 语句——在你的代码中被注释掉了吗?无法判断第二个 foreach 是否应该在第一个 foreach 内。
  • 我在您的代码中没有看到任何表格。你想只用 CSS 做这个吗?
  • 我在您的代码中看不到任何 CSS。 (请删除 CSS 标签)
  • 你们去吧,添加表格。

标签: php html foreach html-table


【解决方案1】:

&lt;tr&gt;&lt;/tr&gt; 标记一行。 &lt;td&gt;&lt;/td&gt; 标记一列。要制作 2 列,每次迭代只使用一组 &lt;tr&gt; 标签,它们之间有两组 &lt;td&gt;&lt;/td&gt;s。

也就是说,$span 到底是什么?它是否包含与$anchors 相同数量的元素,并且您希望每行显示一个项目?如果是这样,您将需要稍微重构您的代码。有几种方法可以做到这一点——这里有一个简单的方法:

<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>";

所以尝试更改我的答案中的相应行。

【讨论】:

  • 已编辑。不是 100% 确定这是你想要的,因为你的问题不是很清楚。
  • 这是我想要的,但我该怎么做。
  • 我粘贴的代码应该做你想做的事......假设它做你想做的事。就像我说的,你的问题不是很清楚,所以我不确定。 :) — 请参阅我在回答中提出的问题。
  • 致命错误:无法在第 123 行的 /home/content/48/10901548/html/bot.php 中使用 DOMNodeList 类型的对象作为数组
  • 哦,这不是一个数组。试试$span($i)-&gt;nodeValue。如果这不起作用,肯定还有另一种方法可以使用$i 访问您想要的元素,但我不知道我的头顶上是怎么回事。也许检查php.net/manual/en/domnodelist.item.php
【解决方案2】:

不了解数据很难,但可能是这样的:

   // 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内置的'current''next'

一些可能对您有所帮助的提示/备注/旁注:
- 请注意,我使用了单引号,因为它们更适合 性能(双引号将由 php 解释)。
- 尝试使用尽可能少的循环(for、while、foreach)。他们是一个强大的 工具,但会很快耗尽内存和性能!
- 如果您使用多个维度(数组内的数组),则仅嵌套循环, 这不是这里的情况(我认为)
- 尝试限制嵌套块的数量(if inside if inside if inside 循环)。我尽量不深入到 2 个级别(这不是绝对的规则,只是一个很好的标准)。如果不可能,请创建一个函数。
- 评论你的代码!我很难理解你的代码(我每天都写 PHP 为生),我可以想象你会在几周内完成。评论可能看起来很浪费时间,但它会大大简化调试,并且在以后更新您(或其他人)代码时是一种祝福!

编辑:
我刚刚注意到您没有使用 DOMNodeList 而不是数组,所以我更新了我的代码。应该可以正常工作,并且代码更清晰。就像我说的,很难看不到数据...

【讨论】:

  • 不错的答案,尽管单引号和双引号之间的性能差异是如此微小以至于无关紧要(请参阅:stackoverflow.com/questions/482202/…)。尤其是在这个脚本中,这不是问题。
  • '好多了'也许确实有点被高估了。我只是认为这是一种很好的做法......
  • 哦,这里也一样。我刚刚发现尝试让其他人这样做是不值得的。 +1 添加建议。
  • 您好,我试过了,但在显示“$href = $a->getAttribute('href');”的行出现错误错误是:错误:在非对象上调用成员函数 getAttribute()
  • 这与您尝试我的答案时遇到的问题相同。 $anchors$span 实际上都不是数组,所以像这个答案那样循环遍历它们是行不通的(foreach 有效,因为它不仅接受数组)。 阅读此页面:php.net/manual/en/domnodelist.item.php 并尝试在那里使用item() 函数——我认为它会起作用。有关更多信息,请参阅我在答案中添加的最后一行。
猜你喜欢
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
相关资源
最近更新 更多