0

私はこれについて少し頭を悩ませてきましたが、解決策を思い付くことができません。

要素で満たされたテキスト ブロックがあり<li>ます。利用した:

$array = explode("<li>", $text_block);

これらのliを異なる配列要素に分離します。これらの要素をすべて出力する foreach ループを作成する必要がありますが、2 つの要素それぞれに 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>

など、配列は空になります。

誰かが同様の問題に遭遇したか、これに対する解決策を持っていますか?

どんな助けでも大歓迎です。

ジェイミー

4

6 に答える 6

5

簡単な解決策は、次を使用すること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>';

ただし、このソリューションには他にも欠点があります。

  • コードから明らかなように、はるかに複雑です。
  • コーナー ケースの 1つでバグを作成するのは非常に簡単です。考えられるバグは次のとおりです。
    • 空の配列に対して空のコンテナーが出力されます (正しい出力がないのではなく)
    • 配列に奇数のアイテムが含まれている場合、最後のコンテナが正しく閉じられない
    • 配列に偶数のアイテムが含まれている場合、出力の最後に空のコンテナが出力されます
    • 配列キーが連続した整数でない場合、メソッドが正しく機能しない
于 2013-09-03T10:23:42.990 に答える
1

li属性があり、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>";
于 2013-09-03T10:38:02.630 に答える
1

これにより、要素が爆発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>';
于 2013-09-03T10:38:31.527 に答える
0

を使用すると、次$arrayのようになりますexplode

$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>、スクリプトはクラッシュしません。

編集によると: 次のような構造を使用する<div><li></li></div>と、W3C が Web ページを検証しない可能性が最も高いことに注意してください。正しい 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>ます。

于 2013-09-03T10:37:45.207 に答える
0

このようなもの

$i = 0;   
echo '<div>'; 
foreach($array as $item)
{
 $i++;
 echo '<li>';
 echo $item;
 echo '</li>';

if($i%2==0)
{
  echo '</div><div>';

}

}
echo '</div>';
于 2013-09-03T10:21:50.357 に答える
0

次のような単純な for ループでそれを行います。

for($i=0;$i<count($array);$i++)
{

    if($i%2==0)
    {
        echo "<div>";
        echo $array[$i].$array[$i+1];
        echo "</div>";
    }

}
于 2013-09-03T10:23:30.687 に答える