2012-03-08 59 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更改为任何想要的值。