以PHP数组中的每两项为目标
我对这件事挠头有点久了,想不出解决办法 我有一个充满以PHP数组中的每两项为目标,php,arrays,html,explode,Php,Arrays,Html,Explode,我对这件事挠头有点久了,想不出解决办法 我有一个充满元素的文本块。我使用了: $array = explode("<li>", $text_block); $array=explode(,$text\u块); 将这些li分隔为不同的数组元素。我需要创建一个foreach循环,它将打印所有这些元素,但也会对每两个元素应用一个div,例如: <div> <li>First array item</li> <li>Second array
元素的文本块。我使用了:
$array = explode("<li>", $text_block);
$array=explode(,$text\u块);
将这些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>
第一个数组项
第二个数组项
第三数组项
第四数组项
以此类推,数组为空
有没有人遇到过类似的问题,或者对此有什么解决办法
任何帮助都将不胜感激
杰米像这样的
$i = 0;
echo '<div>';
foreach($array as $item)
{
$i++;
echo '<li>';
echo $item;
echo '</li>';
if($i%2==0)
{
echo '</div><div>';
}
}
echo '</div>';
$i=0;
回声';
foreach($数组作为$项)
{
$i++;
回音“”;
echo$项目;
回音“ ”;
如果($i%2==0)
{
回声';
}
}
回声';
我会使用这样一个简单的for循环:
for($i=0;$i<count($array);$i++)
{
if($i%2==0)
{
echo "<div>";
echo $array[$i].$array[$i+1];
echo "</div>";
}
}
$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;
对于($i=0;$i来说,简单的解决方案是使用:
$arr=范围(1,4);
foreach(数组\u块($arr,2)作为$pair){
回声';
foreach($pair作为$item){
回显“$item”;
}
回声';
}
这很容易理解,也不容易出现错误,但这有点浪费。经典的解决方案并不浪费,包括模运算符:
$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>';
$arr=范围(1,4);
$index=0;
$inGroup=false;
foreach($arr作为$item){
如果(!$inGroup){
回声';
$inGroup=true;
}
回显“$item”;
如果(++$index%2==0){
回声';
$inGroup=false;
}
}
如果($inGroup)回显“”;
但是,此解决方案还有其他缺点:
- 从代码中可以明显看出,它更为复杂
- 在其中一种情况下编写bug是非常容易的——一个很好的证明就是这样做会有这样的问题。可能的bug包括:
- 为空数组打印的空容器(而不是没有正确的输出)
- 如果数组包含奇数项,则最后一个容器未正确关闭
- 如果数组包含偶数项,则在输出末尾打印的空容器
- 如果数组键不是连续整数,则该方法无法正常工作
您的$array
在使用分解后将如下所示:
$array = array("First array item</li>", "Second array item</li>", ...);
substr($array[$i],0,-5)
负责将尾部的
切掉。您可以尝试这种方法来匹配所有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>";
$content=”
清单1
列表2
清单3
清单4
";
生成拆分内容:
$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>";
$pattern=“/(.*)/”;
preg_match_all($pattern、$content、$matches);
$i=1;
foreach($matches[0]为$match){
如果($i%2!=0)回显“”;
回声$匹配;
如果($i%2==0)回显“”;
$i++;
}
如果($i%2==0)回显“”;
这应该分解您的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标签字符串在这里
$s='1 2 3 4 5 6 7 ;
preg#u match_all(“#]*>”([^使用一个标志,增加它,并检查它是否增加了超过一次,这是一种享受-我也感谢额外的信息,它让我对代码有了更深入的了解。非常感谢。