以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(“#]*>”([^使用一个标志,增加它,并检查它是否增加了超过一次,这是一种享受-我也感谢额外的信息,它让我对代码有了更深入的了解。非常感谢。