我对此有点头疼,无法想出解决方案。
我有一个用<li>
元素填充的文本块。我使用过:
$array = explode("<li>", $text_block);
将这些li分隔成不同的数组元素。我需要创建一个foreach循环,它将打印所有这些元素,但也将一个div应用于每两个元素,例如:
<div>
<li>First array item</li>
<li>Second array item</li>
</div>
<div>
<li>Third array item</li>
<li>Fourth array item</li>
</div>
依此类推,数组为空。
有没有人遇到过类似的问题,或者对此有任何解决方案?
如有任何帮助,我们将不胜感激。
Jamie
简单的解决方案是使用array_chunk
:
$arr = range(1, 4);
foreach(array_chunk($arr, 2) as $pair) {
echo '<div>';
foreach ($pair as $item) {
echo "<span>$item</span>";
}
echo '</div>';
}
这很容易理解,也不容易出现错误,但有点浪费。经典的解决方案并不浪费,它涉及模运算符:
$arr = range(1, 4);
$index = 0;
$inGroup = false;
foreach($arr as $item) {
if (!$inGroup) {
echo '<div>';
$inGroup = true;
}
echo "<span>$item</span>";
if (++$index % 2 == 0) {
echo '</div>';
$inGroup = false;
}
}
if ($inGroup) echo '</div>';
然而,这种解决方案还有其他缺点:
- 它涉及的内容要多得多——从代码中可以明显看出
- 在其中一个角落案例中编写bug是非常容易的——一个很好的证明是,两个这样做的答案都有这样的问题。可能的错误包括:
- 为空数组打印的空容器(而不是没有正确的输出)
- 如果数组包含奇数个项,则最后一个容器未正确关闭
- 如果数组包含偶数个项目,则在输出末尾打印一个空容器
- 如果数组键不是连续整数,则该方法无法正常工作
这应该分解li
元素(假设它们没有子元素),并如您所描述的那样回显输出:
// your li tags string here
$s = '<li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li>';
preg_match_all('#<li ?[^>]*>([^<]*)</li>#', $s, $matches);
foreach ($matches[1] as $i => $li) {
if (!($i %2)) {
if ($i > 0)
echo '</div>';
echo '<div>';
}
echo '<li>'.$li.'</li>';
echo "'n";
}
if (!($i %2)) echo '</div>';
您可以尝试这种方式来匹配所有li
,即使它具有属性并以2:拆分2
内容:
$content = "
<li>List 1</li>
<li class='ok'>List 2</li>
<li>List 3</li>
<li>List 4</li>
";
生成拆分内容:
$pattern = "/<li ?.*>(.*)<'/li>/";
preg_match_all($pattern, $content, $matches);
$i = 1;
foreach ($matches[0] as $match) {
if($i % 2 != 0) echo "<div>";
echo $match;
if($i % 2 == 0) echo "</div>";
$i++;
}
if($i % 2 == 0) echo "</div>";
类似的东西
$i = 0;
echo '<div>';
foreach($array as $item)
{
$i++;
echo '<li>';
echo $item;
echo '</li>';
if($i%2==0)
{
echo '</div><div>';
}
}
echo '</div>';
我会用这样一个简单的for循环来完成:
for($i=0;$i<count($array);$i++)
{
if($i%2==0)
{
echo "<div>";
echo $array[$i].$array[$i+1];
echo "</div>";
}
}
使用explode
:后,您的$array
将如下所示
$array = array("First array item</li>", "Second array item</li>", ...);
所以你可能会使用一个看起来像这样的for循环:
$rtn = "";
for ($i = 0; $i < count($array); $i = $i + 2) {
$rtn .= "<div><li>" . $array[$i] . (($i+1 < count($array)) ? "<li>" . $array[$i+1] : "") . "</div>"
}
echo $rtn;
这将使用现有的"half"标记,然后将$rtn
的内容打印到您的页面上。此外,当具有奇数个<li></li>
标记时,脚本不会崩溃。
Edit说:请注意,使用<div><li></li></div>
这样的结构很可能会导致W3C无法验证您的网页。如果您想要正确的HTML输出,建议使用其他项目。例如,您可以使用<div>
或<span>
标签:
$rtn .= "<div><span>" . substr($array[$i], 0, -5) . "</span>" . (($i+1 < count($array)) ? "<span>" . substr($array[$i+1], 0, -5) . "</span>" : "") . "</div>"
substr($array[$i], 0, -5)
负责切断尾部</li>
。