2012-03-08 63 views
1

的兩列我想在一個表的兩列流傳foreach()循環的結果(因爲這是我的第一篇堆棧溢出抱歉,不能張貼圖片)。我可以看到我要出錯的地方,但不知道如何糾正它。我雖然也許next(),而不是重複foreach(),但似乎無法得到那個工作。任何幫助將不勝感激。傳播的foreach()結果在一個表

我需要這樣的:
RESULT1 RESULT2
result3 result4

,但我發現這一點:
RESULT1 RESULT1
RESULT2 RESULT2

<table> 
<?php 
foreach ($tags as $tag) { 
    echo '<tr><td><input name="taga[]" type="checkbox" value="'.$tag->tag.'" id="'.str_replace(" ", "_", $tag->tag).'_id"'; 
    foreach ($search as $searchword) { 
     if ($searchword == $tag->tag) echo 'checked="checked"'; 
    } 
echo ' /><label for="'.str_replace(" ", "_", $tag->tag).'_id">'.$tag->tag.'</label></td>'; 

next ($tag); 
echo '<td><input name="taga[]" type="checkbox" value="'.$tag->tag.'" id="'.str_replace(" ", "_", $tag->tag).'_id"'; 
     foreach ($search as $searchword) { 
      if ($searchword == $tag->tag) echo 'checked="checked"'; 
     } 
     echo ' /><label for="'.str_replace(" ", "_", $tag- >tag).'_id">'.$tag->tag.'</label></td></tr>';  
} 
?> 
</table> 

回答

5

你應該嘗試簡化您的代碼調試時。這將幫助你隔離問題並使其更容易像StaceOverflow 社區來幫助你。它看起來像這樣:

<?php 
// some fixtures for us to work with 
$tags = array('foo', 'bar', 'lolo',); 

?> 
<pre> 
<?php 
// your actual issue 
foreach ($tags as $tag) { 
    var_dump($tag); 
    next($tag); 
    var_dump($tag); 
} 
?> 
</pre> 

你會看到這個(錯誤)的輸出,這是相當多的問題,你說的是不是? )

string(3) "foo" 
string(3) "foo" 
string(3) "bar" 
string(3) "bar" 
string(4) "lolo" 
string(4) "lolo" 

next()簽名是:

mixed next (array &$array) 

,這意味着它從其通過引用傳遞數組返回任何類型的值。在你的情況下,它適用於這樣的:

$tag = next($tags); 

但是,如果你最後一個項目調用next()會發生什麼?

這個函數可以返回布爾值FALSE,但也可能返回的值爲FALSE一個 非布爾值。有關更多信息,請閱讀 布爾的部分。使用===運算符來測試此功能的 返回值。

你應該打破了循環,如果未來返回false,例如:

$tag = next($tags); 
if ($tag === false) break; 

更多闡述例如:

<?php 
class Tag { 
    public $tag; 
    public function __construct($tag) { 
     $this->tag = $tag; 
    } 
} 
$tags = array(); 
foreach (array('foo', 'bar', 'lolo',) as $word) { 
    $tags[] = new Tag($word); 
} 
$search = array('bar', 'the'); 


?> 
<pre> 
<?php 
foreach ($tags as $tag) { 
    var_dump($tag); 
    $tag = next($tags); 
    if ($tag === false) { 
     break; 
    } 
    var_dump($tag); 
} 
?> 
</pre> 

將輸出就好

object(Tag)#1 (1) { 
    ["tag"]=> 
    string(3) "foo" 
} 
object(Tag)#3 (1) { 
    ["tag"]=> 
    string(4) "lolo" 
} 
object(Tag)#2 (1) { 
    ["tag"]=> 
    string(3) "bar" 
} 

這裏的應用到你的代碼的溶液(測試/工作):

<table> 
<?php 
foreach ($tags as $tag) { 
    echo '<tr><td><input name="taga[]" type="checkbox" value="'.$tag->tag.'" id="'.str_replace(" ", "_", $tag->tag).'_id"'; 
    foreach ($search as $searchword) { 
     if ($searchword == $tag->tag) echo 'checked="checked"'; 
    } 

    echo ' /><label for="'.str_replace(" ", "_", $tag->tag).'_id">'.$tag->tag.'</label></td>'; 

    $tag = next ($tags); 
    if ($tag === false) { 
     break; 
    } 


    echo '<td><input name="taga[]" type="checkbox" value="'.$tag->tag.'" id="'.str_replace(" ", "_", $tag->tag).'_id"'; 

    foreach ($search as $searchword) { 
     if ($searchword == $tag->tag) echo 'checked="checked"'; 
    } 
    echo ' /><label for="'.str_replace(" ", "_", $tag->tag).'_id">'.$tag->tag.'</label></td></tr>'; 
} 
?> 
</table> 

PHP手冊明年還包括重要的注意

注意:您將無法添加到數組的結尾從 布爾FALSE元件進行區分。要正確遍歷可能包含 FALSE元素的數組,請參閱each()函數。

+0

現在,這就是我所說的內置課程的徹底答案。謝謝@ jpic你是明星。並簡化了代碼。 – 2012-03-08 16:23:34

+0

任何時候,請[關閉您的問題](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – jpic 2012-03-09 02:12:25

+0

好的答案。請注意,最終的解決方案將生成一個表格,最後一行只包含一個td並且沒有關閉tr標籤。如果虛假部分應該在休息之前回顯空td並關閉tr。 – eselk 2013-10-02 20:12:30

0

如果兩列是完全一樣的,或者特別是如果你需要超過2,我建議這個濃縮的方法(我沒有做大量的測試研究這個):

  <table> 
       <tr> 
      <?php 
      $count = 0; 
      $columnCount = 2; 
      foreach ($interests as $interest) { 
       if($count++ % $columnCount == 0){ 
        echo "</tr><tr>"; 
       } 
       echo "<td>$interest->name</td>"; 
      } 
      while($count++ % $columnCount != 0){ 
       echo "<td>&nbsp;</td>"; 
      } 
      ?> 
       </tr> 
      </table> 

不會正確處理一個空數組,所以你應該添加你自己的代碼來處理它。如果您想要多於2列,您可以將columnCount更改爲任何想要的值。