สอบถามเรื่อง loop ของ PHP หน่อยครับ

เริ่มโดย ru, 03 มีนาคม 2011, 16:45:16

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

ru

ผมอยากจะสอบถามเรื่องการวน loop ของ PHP ครับ

ผมอยากจะให้การแสดงผลของโค้ดที่ผมเขียน ออกมาเป็นดังนี้ครับ

<li>
<div id="box-1"></div>
<div id="box-2"></div>
<div id="box-3"></div>
<div id="box-4"></div>
<div id="box-5"></div>
<div id="box-6"></div>
<div id="box-7"></div>
<div id="box-8"></div>
<div id="box-9"></div>
</li>
<li>
<div id="box-10"></div>
<div id="box-11"></div>
<div id="box-12"></div>
<div id="box-13"></div>
<div id="box-14"></div>
<div id="box-15"></div>
<div id="box-16"></div>
<div id="box-17"></div>
<div id="box-18"></div>
</li>

ไปเรื่อยๆ ตามข้อมูลที่มี


ปัญหาตอนนี้คือมันแสดง div ทุกไอดีอยู่ใน li ตัวเดียวครับซึ่งมันไม่ใช่สิ่งที่ผมต้องการ ที่ผมต้องการคือให้ li ตัวนึง มี div อยู่ในนั้น 9 ตัวครับ ทำแบบนี่ไปเรื่อยๆ ตามแต่ข้อมูลที่มี
อยากทราบว่าจะต้องเขียนยังไงให้มันแสดงผลได้ตามเงื่อนไขที่ผมต้องการครับ ข้างล่างนี้เป็นโค้ดที่ต้องการเขียนเงื่อนไขนี้เข้าไปครับ รบกวนพี่ๆ ช่วยดูให้ทีครับ ว่าต้องเขียนอะไรเพิ่มเข้าไปครับ ให้มันทำงานได้ตามเงื่อนไขที่ต้องการครับ


  if ( $query->have_posts() ) {
     while ($query->have_posts()) : $query->the_post() ;

$values = get_post_custom_values("thumb");
         $thumbnail = get_bloginfo('template_directory') . '/scripts/timthumb.php?src=' . $values[0];
         $thumbnail = $thumbnail . '&w=' . $w . '&h=' . $h . '&zc=1';

         $excerpt = strip_tags(get_the_excerpt());
         $excerpt = strip_shortcodes($excerpt);
         $excerpt = explode(' ', $excerpt, ($summarywordlimit + 1));

         if(count($excerpt) > $summarywordlimit) {
           array_pop($excerpt);
           $excerpt = implode(' ', $excerpt) . '...';

         } else {
           $excerpt = implode(' ', $excerpt);
         }

         $boxcode .= '<li><div id="box' . $i . '" class="each-box">';
         $boxcode .= '<div class="inner-dropshadow"></div><span class="box-thumbnails">';
         $boxcode .= '<a class="thumblink" href="' . get_permalink() . '">';
         $boxcode .= '<img src="' . $thumbnail . '"></a></span>';
         $boxcode .= '<div class="the-box-slider"><span class="box-metadata">';
         $boxcode .= '<span class="commentcount">' . get_comments_number() . '</span>';
         $boxcode .= '<span class="published-date">' . get_the_time( get_option('date_format') );
         $boxcode .= '</span></span>';
         $boxcode .= '<span class="box-summary"><a href="' . get_permalink() . '" rel="bookmark">';
         $boxcode .= '<h3 class="post-title">' . get_the_title() . '</h3></a>';
         $boxcode .= $excerpt . '</span></div></div></li>'; 

         $i++;

     endwhile;
     echo $boxcode .= '</ul><div class="clear"></div></div>';
  }
}


Juhmoo

ต้องแยกตรงแท็ก <li> ออกมาครับ
แทรกเข้าจากเงื่อนไขนี้ก็ได้ครับ



$cal = $i % 9;  // ใช้คำนวณเพื่อหารอบที่เราจะใส่ <li> และ </li> เมื่อใช้ div ครบ 9 ครั้ง

ด้านบนสุด
if($cal == 0){
   $boxcode .= '<li>';
}

ด้านล่างสุด
if($cal == 0){
   $boxcode .= '</li>';
}



ru

งงนิดนึงครับ คือเอาไปวางไว้ตรงส่วนไหนหรอครับ
แล้วค่า $i ถูกกำหนดไปเป็น 1 อ่ะครับ แบบนี้มันจะหารอบได้หรือไม่ครับ รบกวนแนะนำทีนะครับ โค้ดเต็มมันมีตามนี้ครับ

function box_posts($count=9, $cat='home', $w=100, $h=100, $summarywordlimit=100) {

  global $post;
  $paged = get_query_var("paged");
  $boxquery = "category_name='.$cat&posts_per_page=";
  $query = new WP_Query($boxquery);
  $i = 9;
  $boxcode = '<div id="slider"><ul>';

  if ( $query->have_posts() ) {
     while ($query->have_posts()) : $query->the_post() ;

$values = get_post_custom_values("thumb");
         $thumbnail = get_bloginfo('template_directory') . '/scripts/timthumb.php?src=' . $values[0];
         $thumbnail = $thumbnail . '&w=' . $w . '&h=' . $h . '&zc=1';

         $excerpt = strip_tags(get_the_excerpt());
         $excerpt = strip_shortcodes($excerpt);
         $excerpt = explode(' ', $excerpt, ($summarywordlimit + 1));

         if(count($excerpt) > $summarywordlimit) {
           array_pop($excerpt);
           $excerpt = implode(' ', $excerpt) . '...';

         } else {
           $excerpt = implode(' ', $excerpt);
         }

         $boxcode .= '<li><div id="box' . $i . '" class="each-box">';
         $boxcode .= '<div class="inner-dropshadow"></div><span class="box-thumbnails">';
         $boxcode .= '<a class="thumblink" href="' . get_permalink() . '">';
         $boxcode .= '<img src="' . $thumbnail . '"></a></span>';
         $boxcode .= '<div class="the-box-slider"><span class="box-metadata">';
         $boxcode .= '<span class="commentcount">' . get_comments_number() . '</span>';
         $boxcode .= '<span class="published-date">' . get_the_time( get_option('date_format') );
         $boxcode .= '</span></span>';
         $boxcode .= '<span class="box-summary"><a href="' . get_permalink() . '" rel="bookmark">';
         $boxcode .= '<h3 class="post-title">' . get_the_title() . '</h3></a>';
         $boxcode .= $excerpt . '</span></div></div></li>'; 

         $i++;

     endwhile;
     echo $boxcode .= '</ul><div class="clear"></div></div>';
  }
}


Juhmoo

ลองแบบนี้ดูครับ ไม่แน่ใจว่าทำไมด้านบน $i = 9;

function box_posts($count=9, $cat='home', $w=100, $h=100, $summarywordlimit=100) {

  global $post;
  $paged = get_query_var("paged");
  $boxquery = "category_name='.$cat&posts_per_page=";
  $query = new WP_Query($boxquery);
  $i = 9;
  $boxcode = '<div id="slider"><ul>';

  if ( $query->have_posts() ) {
     while ($query->have_posts()) : $query->the_post() ;

$cal = $i % 9;

$values = get_post_custom_values("thumb");
         $thumbnail = get_bloginfo('template_directory') . '/scripts/timthumb.php?src=' . $values[0];
         $thumbnail = $thumbnail . '&w=' . $w . '&h=' . $h . '&zc=1';

         $excerpt = strip_tags(get_the_excerpt());
         $excerpt = strip_shortcodes($excerpt);
         $excerpt = explode(' ', $excerpt, ($summarywordlimit + 1));

         if(count($excerpt) > $summarywordlimit) {
           array_pop($excerpt);
           $excerpt = implode(' ', $excerpt) . '...';

         } else {
           $excerpt = implode(' ', $excerpt);
         }

if($cal == 0){
    $boxcode .= '<li>';
}
         $boxcode .= '<div id="box' . $i . '" class="each-box">';
         $boxcode .= '<div class="inner-dropshadow"></div><span class="box-thumbnails">';
         $boxcode .= '<a class="thumblink" href="' . get_permalink() . '">';
         $boxcode .= '<img src="' . $thumbnail . '"></a></span>';
         $boxcode .= '<div class="the-box-slider"><span class="box-metadata">';
         $boxcode .= '<span class="commentcount">' . get_comments_number() . '</span>';
         $boxcode .= '<span class="published-date">' . get_the_time( get_option('date_format') );
         $boxcode .= '</span></span>';
         $boxcode .= '<span class="box-summary"><a href="' . get_permalink() . '" rel="bookmark">';
         $boxcode .= '<h3 class="post-title">' . get_the_title() . '</h3></a>';
         $boxcode .= $excerpt . '</span></div></div>';
if($cal == 0){
    $boxcode .= '</li>';
}

         $i++;

     endwhile;
     echo $boxcode .= '</ul><div class="clear"></div></div>';
  }
}


แบบนี้หรือเปล่าครับ

ru

ผมเขียนผิดครับ $i = 1 ครับ

ลองตามโค้ดที่ท่านได้ให้มา li มันไปครอบอยู่ที่ div ที่ 9 ตัวเดียวครับ ตัวอื่นๆ มันไม่ได้ครอบไว้เลยครับ มันเป็นประมาณนี้ครับ

<div>
<ul>
<div id="box-1"></div>
<div id="box-2"></div>
<div id="box-3"></div>
<div id="box-4"></div>
<div id="box-5"></div>
<div id="box-6"></div>
<div id="box-7"></div>
<div id="box-8"></div>
<li><div id="box-9"></div></li>
</ul>
</div>

Juhmoo

อ้างถึงจาก: ru ใน 03 มีนาคม 2011, 17:37:22
ผมเขียนผิดครับ $i = 1 ครับ

ลองตามโค้ดที่ท่านได้ให้มา li มันไปครอบอยู่ที่ div ที่ 9 ตัวเดียวครับ ตัวอื่นๆ มันไม่ได้ครอบไว้เลยครับ มันเป็นประมาณนี้ครับ

<div>
<ul>
<div id="box-1"></div>
<div id="box-2"></div>
<div id="box-3"></div>
<div id="box-4"></div>
<div id="box-5"></div>
<div id="box-6"></div>
<div id="box-7"></div>
<div id="box-8"></div>
<li><div id="box-9"></div></li>
</ul>
</div>


ต้องให้มัน start ที่ $i = 0; ครับ
ถึงจะออกมาถูก


ru

ได้แล้วครับผม แต่ก็มีปัญหาตามมาด้วยครับ การแสดงผลเหมือนว่ามันยังไม่เข้าคอนเซปครับ
ตอนนี้มันจะรันออกมาได้ดังนี้ครับ

<li>
<div id="box-1"></div>
.
.
.
<div id="box-8"></div>
</li>
<li>
<div id="box-9"></div>
</li>
<div id="box-10"></div>
<div id="box-11"></div>
.
.
.

box 1-8 จะอยู่ใน li ครับ พอถึง box9 ก็จะไปขึ้น li ตัวใหม่ พอเข้า box10...... ต่อไปมันก็จะไม่มี li ครอบไว้แล้วครับ
เหมือนว่ามันจะเข้าเงื่อนไขก็ต่อเมื่อหารค่า i ออกมาได้ 9 รึเปล่าครับ ผมงงตรงนี้แหละครับ รบกวนสอนหน่อยนะครับ ว่าต้องปรับตรงไหนอีกบ้าง

Juhmoo

คือผมอาจจะเขียนลอจิกไม่ครอบคุมทุกเคสน่ะครับ
อีกอย่างผมไม่ได้ลองรันดูในเครื่องด้วยแหล่ะ มันเลยอาจจะผิดพลาดขึ้น
คือตอนนี้เหมือนผมให้มันคำนวณจากการ mod ด้วย 9 ถ้าได้ค่า 0
ให้โปรแกรมใส่ <li> แล้วก็ปิด </li> มันก็จะทำงานแบบนี้ครับ
$i = 0 ให้ใส่ <li>
$i = 9 ให้ใส่ </li> <li>
$i = 18 ให้ใส่ </li>

แต่น่าจะยังผิดอยู่ ถ้าดูจากผลลัพธ์ที่คุณให้ดู
ถ้าไงขอรายละเอียดมากกว่านี้ได้ไหมครับ PM มาก็ได้ครับ
ผมจะได้โค๊ดให้ถูก

mrtomson

#9

<?php
for($i=1;$i<=15;$i++)
{
echo "<li>\n";
for($ii=1;$ii<=9;$ii++)
{
echo " <div id=\"box-".$ii."\"></div>\n";
}
echo "</li>\n";
}
?>



ลองดูนะครับว่า ใช่แบบที่ต้องการไหม ผมว่างๆพอดีเลยเขียนให้ คิดว่าแบบนี้้เวลาแก้น่าจะดูง่ายสบายตามากกว่า
:wanwan020:
ติดต่อได้ทาง PM นะครับ

aCustiCz


ru

โค้ดนี้มันเป็นไว้ใช้กับ wordpress อ่ะครับ ไม่รู้ว่าท่าน Juhmoo พอจะชำนาญไหมครับ ผมจะได้ PM ไปหาครับ
ปัญหาติดอยู่ตรงนี้ส่วนเดียวเลย ผมเองก็หมดปัญญาที่จะแก้ไขครับ

และขอขอบคุณคุณ mrtomson ด้วยนะครับ ขอถามอีกนิดนึงว่า ผมต้องนำโค้ดของท่านไปวางตรงไหนบ้างครับ ในส่วนโค้ดของผม
ที่ผมถามแบบนี้เพราะผมไม่ชำนาญจริงๆครับ รบกวนหน่อยนะครับ

Boyjato

ลองใช้ algo นี้นะครับ
ผมคิดว่าน่าจะได้
พอดีว่างๆ ยังไม่ได้เขียนเป็น php

for i=1 to n
   <li>
   for j=1 to 9
      <div id="box- j+9(i-1) "></div>      
   end for
   </li>
end for

New2th

_
#13
 :wanwan008:

supaman


<?php
            $n 
18;
            for(
$i=1;$i<=$n;$i++){
                if((
$i%9)==0){
                    echo 
"<div id=\"box-$i\"></li>";
                }else if((
$i%9)==1){
                    echo 
"<li><div id=\"box-$i\">";
                }else{
                    echo 
"<div id=\"box-$i\">";
                }
            }
        
?>