• ベストアンサー

配列内容を列を跨いでforeachで表示したいです

PHPで配列内容を、<ul>タグを跨いで表示させたいです。 例えば、8個の要素がある配列を3列で表示させたいとき、 下記のような順番で表示させるには、どうすれば良いでしょうか? <ul>  <li>1</li>  <li>4</li>  <li>7</li> </ul> <ul>  <li>2</li>  <li>5</li>  <li>8</li> </ul> <ul>  <li>3</li>  <li>6</li> </ul>

質問者が選んだベストアンサー

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

俺なら こうするかなー程度の書き殴り。 <?php $data = array(1,2,3,4,5,6,7,8); $DimRow = array(); foreach ($data as $i => $val) { $num = $i%3; $DimRow[$num].= "<li>" . $val; } foreach($DimRow as $num=> $dat) { print "<ul>" . $dat . "</ul>"; } ?>

re97
質問者

補足

回答ありがとうございました。 大変参考になりましたー ちなみに、この書き方で、配列要素数が4つだった場合、 結果を下記のようにすることはできるでしょうか? <ul><li>1</li><li>2</li></ul> <ul><li>3</li></ul> <ul><li>4</li></ul>

その他の回答 (6)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.7

>ちなみに、この二重ループの書き方で、配列要素数が4つだった場合、結果を下記のようにすることはできるでしょうか? 別の方も書かれていますが、何をどうしたいのかを論理的に説明できない物は、プログラムに書けません。人工知能のような物を作ればあり得るが、それにしても多くのケースから学ぶことになるので1例だけでは無理。 >また、回答まではどういう過程を踏んでるのでしょうか? >質問見た瞬間に答えが頭に思い浮かぶのでしょうか? >それとも何らかの試行錯誤なりをするのでしょうか? 二重ループにするというのは、すぐ浮かぶこと。 あとは、グループ内は 1 → 4 → 7 なので3ずつ加算する。また、それぞれのグループの1つめは、1 → 2 → 3 なので1つずつ加算することから自明。 ifで配列をはみ出してないかチェックするのは、エラーになって後から追加しました。 最初によく考えれば気づくとは思いますが、何回も実行しながら改善する方が楽です。

re97
質問者

お礼

過程の件、詳細に回答いただきありがとうございました >何回も実行しながら改善する方が楽です 大変参考になりましたー

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.6

3の人です。 > ちなみに、この書き方で、配列要素数が4つだった場合、 > 結果を下記のようにすることはできるでしょうか? > <ul><li>1</li><li>2</li></ul> > <ul><li>3</li></ul> > <ul><li>4</li></ul> 不規則なので、3の書き方では無理です。 パターンのサンプルが何種類かあれば、規則性を探して、書きようはあります。

re97
質問者

お礼

・回答ありがとうございます >3の書き方では無理です ・3の回答、見た目も分かりやすくて良いなと思っていたので、ちょっと残念です… >不規則なので、 ・なるほど。「要素数をなるべく均等にしたい」というのは、言われてみれば曖昧ですね >パターンのサンプルが何種類かあれば、規則性を探して、書きようはあります ・具体的にどうこうというのは特にないのですが、3でいただいた回答が非常に良い感じだったので、 これを違う並べ方にももしかして出来るのだろうか? と思い質問しました ・色々参考になりましたー

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

No4です。 そうですか。では、foreachではなくてforですが、 $a = array(1,2,3,4,5,6,7,8,9,10,11); $col = 3; $n = count($a); for($j=0; $j<$col; $j++){ echo "<ul>\n"; for($i=0; $i<$n; $i+=$col){ if($i+$j<$n){ echo " <li>".$a[$i+$j]."</li>\n"; } } echo "</ul>\n"; } 出力したい物が二重構造なので、二重ループにするのがいいです。

re97
質問者

補足

回答ありがとうございました。 望む結果を得ることが出来ました! ちなみに、この二重ループの書き方で、配列要素数が4つだった場合、 結果を下記のようにすることはできるでしょうか? <ul><li>1</li><li>2</li></ul> <ul><li>3</li></ul> <ul><li>4</li></ul また、回答まではどういう過程を踏んでるのでしょうか? 質問見た瞬間に答えが頭に思い浮かぶのでしょうか? それとも何らかの試行錯誤なりをするのでしょうか? 慣れの問題?

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

3列とは? <ul>の中の<li>も3つ、<ul>の数も3つで、どちらのことか不明です。 例えば、1~11だとすると、次のどちらですか? =================かたまりの数が3で、かたまりの中の個数が増えていく 1 4 7 10 2 5 8 11 3 6 9 =================かたまりの中の数が3で、かたまりの数が増えていく 1 5 9 2 6 10 3 7 11 4 8 =================

re97
質問者

補足

問い合わせありがとうございました。 上の方の意味で質問しましたー =================かたまりの数が3で、かたまりの中の個数が増えていく 1 4 7 10 2 5 8 11 3 6 9

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

ANo.1です。 失礼。縦横を入れ替えるんですね(汗 こんな感じで如何でしょう <?php $data = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14); $cnt = 0; $max = count($data); $size = intval(ceil($max / 3)); foreach ($data as $key=>$val) { if ($cnt++ === $size) { break; } print '<ul>' . PHP_EOL; print '<li>' . $val . '</li>' . PHP_EOL; $tmp = $key; while (($tmp += $size) < $max) { print '<li>' . $data[$tmp] . '</li>' . PHP_EOL; } print '</ul>' . PHP_EOL; }

re97
質問者

補足

回答ありがとうございました。 質問時には書いていなかったのですが、 できれば要素数をなるべく均等にしたいのですが、可能でしょうか? ■配列要素数が4つだった場合 回答いただいた内容 <ul>  <li>1</li>  <li>2</li>  <li>3</li> </ul> <ul>  <li>4</li> </ul> 希望 <ul>  <li>1</li>  <li>4</li> </ul> <ul>  <li>2</li> </ul> <ul>  <li>3</li> </ul> もしくは <ul>  <li>1</li>  <li>2</li> </ul> <ul>  <li>3</li> </ul> <ul>  <li>4</li> </ul>

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

phpに限らずどんな言語でも基礎的なロジックだと思いますが・・・ 普通はこんな感じで書きますかね <?php $data = array(1,2,3,4,5,6,7,8); $col = 0; foreach ($data as $val) { if ($col === 3) { // 3列書き出していたらul要素を閉じる print '</ul>' . PHP_EOL; $col = 0; } if ($col === 0) { // 最初 or 前のul要素が閉じていたら print '<ul>' . PHP_EOL; } print '<li>' . $val . '</li>' . PHP_EOL; $col++; } if ($col > 0) { print '</ul>' . PHP_EOL; } // ul要素の開始を書き出していたら閉じる

re97
質問者

補足

回答ありがとうございましたー

関連するQ&A