0

だから私は出会い系サイトへの贈り物を処理しようとしています。ギフトの最大数は9で、9つのギフトスパンを返す必要があります。9つのギフトを持っているユーザーの場合、9つすべてがデータベースから返されるか、4つがデータベースから返され、残りの5つがforループから返されます。 dbから0、forループからすべて9。mysql dbが照会され、whileループがユーザーのギフトを出力します。一方、forループは、whileループの出力に応じて、合計9つのギフトスパンが返されるようにします(これは現在正しくラップされていません)。

$i=0;
while($row = $user_gifts->fetch(PDO::FETCH_ASSOC)){
    $i++;   
    $gift_name = $row["gift_name"];

    if ($i%3==1) {
      $gifts_show .= '<div>';
    }
    $gifts_show .= '<span>'.$gift_name.'</span>';   
}


    if($i<1){ //0 gifts from db, all 9 no gifts
       $i=0;
       for ($i = $i; $i < 9; $i++) {
            if ($i%3==1) $gifts_show .= '<div>';    
                $gifts_show .= '<span>No Gift.</span>';
            if ($i%3==0) $gifts_show .= '</div>';
       }
    } else { //1+ gifts from db, mix gifts with no gifts until 9 are reached
       for ($i = $i; $i < 9; $i++) {
                $gifts_show .= '<span>No Gift.</span>';
            if ($i%3==0) $gifts_show .= '</div>';
       }
    }

3つのギフトごとにdivでラップする必要があります。したがって、3つのdivでラップされた9つのギフトの出力は、次のようになります。

<div>
  <span>DB Gift 1</span> 
  <span>DB Gift 2</span> 
  <span>DB Gift 3</span> 
</div>
<div>
  <span>DB Gift 4</span> 
  <span>No Gift</span> 
  <span>No Gift</span> 
</div>
<div>
  <span>No Gift</span> 
  <span>No Gift</span> 
  <span>No Gift</span> 
</div>

DBから出力されるギフトの数に関係なく、div内の3スパンごとに正しく3回出力してラップする方法はありますか?

4

1 に答える 1

2

これはすべて、単純な配列操作に関するものです。

私が次の配列を持っていると想像してみましょう:

$array = array(
    'DB Gift 1',
    'DB Gift 2',
    'DB Gift 3',
    'DB Gift 4'
);

...でも9つの要素を示したいと思います。そこで、最初に「空の」要素を埋め込みます。

$array = array_pad($array, 9, 'No Gift');

...そして3つのブロックで表示したいので、3つのブロックに分割します。

$array = array_chunk($array, 3);

...そして今では、すべてを結合するという単純なケースです。したがって、最初にすべての内部要素を結合します。

foreach ($array as &$block) {
    $block = '<span>'.implode('</span><span>', $block).'</span>';
}

...そして私は外側の要素を結合します:

$result = '<div>'.implode('</div><div>', $array).'</div>';

仕事は終わりました。

それが機能しているのを見る

于 2012-09-21T16:55:23.247 に答える