0

刚开始用PHP来忍受我。

我正在努力实现的结果:

我有一张 YouTube URL 和元数据表。试图建立这个:

<div class="slide">
    <iframe></iframe>
    <iframe></iframe>
</div>
<div class="slide">
    <iframe></iframe>
    <iframe></iframe>
</div>

每张幻灯片有两个视频,然后我将使用 Deck.js 对结果进行分页。

我怀疑我的做法完全错误,而不是在编程逻辑方面经验丰富;

while($data = mysql_fetch_array($result)) {
    for ($counter = 1; $counter<=2; $counter++) {
        echo "<div class=\"slide\">";

        echo "<h3>" . $data['VIDEO_TITLE'] . "</h3>";
        echo "<iframe width=\"560\" height=\"315\" src=\"" . $data['VIDEO_URL'] . "\" frameborder=\"0\" allowfullscreen></iframe>";

        /* If Video 1, increment counter for 2nd video */
        if ($counter == 1) {
            $counter++;
        }
        /* If Video 2, close div and reset counter */
        else if ($counter == 2) {
            echo "</div>";
            $counter = 1;
        }
        /* If error break out */
        else {
            echo "</div>";
            break;
        }
    }
}

基本上试图嵌套循环以跟踪每个 div 有多少视频,并在 div 有两个时开始一个新的。

我尝试了几种不同的方法,这是最新的。结果是:

<div class="slide">
    <iframe></iframe>
<div class="slide>
    <iframe></iframe>

现在碰到空白墙,不知道下一步该尝试什么。愿意使用/学习任何方法来完成结果,只是现在不知道该去哪里。

干杯。

4

5 回答 5

0

将回声放在循环<div> 之前for(仍在循环内)while和循环</div> 之后for

于 2013-06-22T15:14:50.493 回答
0

在您的while循环中,您只检索一行,但随后您将使用嵌套循环对其进行两次迭代。取消内部循环,只需使用触发器变量来跟踪左右。我认为这会做你想要的:

$left=true;  // track whether we're emitting HTML for left or right video

while($data = mysql_fetch_array($result)) {
  if ($left) {
    echo "<div class=\"slide\">";
    echo "<h3>" . $data['VIDEO_TITLE'] . "</h3>";
  }
  echo "<iframe width=\"560\" height=\"315\" src=\"" . $data['VIDEO_URL'] . "\" frameborder=\"0\" allowfullscreen></iframe>";
  if (!$left) {
    echo "</div>";
  }
  $left = !$left; // invert $left to indicate we're emitting the right iFrame
}

// end of loop. If we had an odd number of
// videos, tidy up the HTML
if (!$left) {
    echo "</div>";
}    
于 2013-06-22T15:26:03.927 回答
0

它不起作用,因为 for 循环在 SQL 数据的 fetch 循环内。for 循环的第二次迭代没有新的 SQL 行。更好的解决方案是捕获标识两个视频(标题)的公共列,并在该值更改时生成一个新的 div。尝试这样的事情,这将适用于具有相同标题的任意数量的 SQL 行。如果 SQL 查询不返回任何行,这也将给出正确的结果,并且将处理只有一个 URL 的标题的可能性 - 如果您只是翻转并最终得到错误标题上的 URL,这可能会变得很难看。当然,与您当前的解决方案一样,您的 SQL 查询必须 ORDER BY VIDEO_TITLE 以便行是相邻的。我没有运行它,但应该很接近。

$lastTitle = "";
$n = 0;         //count SQL rows processed
while($data = mysql_fetch_array($result)) {
    // See if the title changed from last
    if( $data['VIDEO_TITLE'] != $lastTitle ) {
        // if we processed any rows, must end the current div before starting a new one
        if( $n > 0 )        
          echo "</div>";

        echo "<div class=\"slide\">";
        echo "<h3>" . $data['VIDEO_TITLE'] . "</h3>";       
        //save the title as last title      
        $lastTitle = $data['VIDEO_TITLE'];  
    }

    $n++;   //count the SQL row
     echo "<iframe width=\"560\" height=\"315\" src=\"" . $data['VIDEO_URL'] . "\" frameborder=\"0\" allowfullscreen></iframe>";
}   
if( $n > 0 )
    echo "</div>";
于 2013-06-22T15:48:39.693 回答
0

您可以使用 % 运算符(模数)一起删除第二个循环。这个想法是 a % b === 0 那么数字 a 可以被 b 整除。使用它,您可以轻松地检查偶数或奇数或每第 N 行。

$k = 1;
echo "<div class=\"slide\">";

while($data = mysql_fetch_array($result)) { // you should really change to mysqli or PDO

    if($k % 3 === 0){
        echo "</div>";
        echo "<div class=\"slide\">";
    }

        echo "<h3>" . $data['VIDEO_TITLE'] . "</h3>";
        echo "<iframe width=\"560\" height=\"315\" src=\"" . $data['VIDEO_URL'] . "\" frameborder=\"0\" allowfullscreen></iframe>";

    $k++;
}
echo "</div>";
于 2013-06-22T15:27:25.133 回答
0

PHPFiddle

<?php
  $x = 10;
  $counter = 0;
  while($x > 0)
  {
      if($counter != 0 && $counter % 2 == 0)
      {
          echo "ENDOFSLIDE</br>";
      } 
     if($counter == 0 || $counter % 2 == 0)
     {
       echo "SLIDE</br>";
     }
      echo "iframe => $x </br>";


      $x--;
      $counter++;
  }
  echo "ENDOFSLIDE";
?>
于 2013-06-22T15:33:49.080 回答