2009-10-25 47 views
0

我很难从数组中获取正确的数据。我写了一个嵌套的foreach循环,但内部循环抛出了“为foreach()提供的”无效参数“错误。有人能帮我解决这个问题吗?谢谢。如何写一个会产生我想要的结果的foreach

foreach($row as $val) 
{ 
    echo $val['title'].'<br>'; 
    echo $val['author'].'<br>'; 
    echo $val['post'].'<br>'; 
    echo $val['entry_date'].'<br>'; 
    echo $val['comments'].'<br>'; 

    foreach($val as $val2) 
    { 
     echo $val['comments'].'<br>'; 
    } 
} 

Array 
(
    [title] => First Blog 
    [author] => Administrator 
    [post] => Testing entry number one 
    [entry_date] => Fri, 23 Oct 2009 
    [comments] => Array 
     (
      [0] => Array 
       (
        [commenter] => Sally Anderson 
        [comments] => comment 1 post 1 
        [comment_date] => October 24th, 2009 at 5:24 AM 
       ) 

      [1] => Array 
       (
        [commenter] => Mike Jones 
        [comments] => comment 2 post 1 
        [comment_date] => October 24th, 2009 at 5:21 AM 
       ) 
     ) 
) 
Array 
(
    [title] => Second Blog 
    [author] => Administrator 
    [post] => Testing entry number two 
    [entry_date] => Sat, 24 Oct 2009 
    [comments] => Array 
     (
      [0] => Array 
       (
        [commenter] => Sally Anderson 
        [comments] => comment 1 post 2 
        [comment_date] => October 24th, 2009 at 5:21 AM 
       ) 

      [1] => Array 
       (
        [commenter] => Mike Jones 
        [comments] => comment 2 post 2 
        [comment_date] => October 24th, 2009 at 5:21 AM 
       ) 
     ) 
) 

回答

3

假设$rows是你的问题(数组的数组)的底部结构,那么:

foreach ($rows as $row) { 
    echo <<<END 
$row[title]<br> 
$row[author]<br> 
$row[post]<br> 
$row[entry_date]<br> 
END; 
    foreach ($row['comments'] as $comment) { 
    echo <<<END 
$comment[comments]<br> 
$comment[commentor]<br> 
$comment[comment_date]<br> 
END; 
    } 
} 

我强烈建议你选择有意义的名称(如$comment$row)而不是无意义的名字,如$val$val2,因为这些只会导致混淆。

另外我在修改后的版本中使用了heredoc syntax,因为我倾向于认为可以使事情更具可读性,但这是可选的。一个更好的选择可能是:

<?php foreach ($rows as $row): ?> 
<?php echo $row['title'] ?><br> 
<?php echo $row['post'] ?><br> 
<?php echo $row['entry_date'] ?><br> 
<?php foreach ($row['comments'] as $comment): ?> 
<?php echo $comment['comments'] ?><br> 
<?php echo $comment['commentor'] ?><br> 
<?php echo $comment['comment_date'] ?><br> 
<?php endforeach; ?> 
<?php endforeach; ?> 

如果你有很多HTML散布的话,这会很有用。上述切换到使用alternative control structures,这是可选的,但通常被认为在这种类型的代码更易读。

最后,你可以PHP short tags,有些人不喜欢(或者是因为他们可能被禁用或者用XML处理指令接口),但我一般喜欢:

<? foreach ($rows as $row): ?> 
<?= $row['title'] ?><br> 
<?= $row['post'] ?><br> 
<?= $row['entry_date'] ?><br> 
<? foreach ($row['comments'] as $comment): ?> 
<?= $comment['comments'] ?><br> 
<?= $comment['commentor'] ?><br> 
<?= $comment['comment_date'] ?><br> 
<? endforeach; ?> 
<? endforeach; ?> 
+0

嗨Cletus,感谢您的帮助。我试过这个,但我仍然收到错误。我收到价值回声,但错误仍然出现在我的日志中。有任何想法吗? – Jack 2009-10-25 04:41:17

+0

Cletus,谢谢。你的解决方案有效,但我不知道为什么......谢谢。我也会研究heredoc语法。 – Jack 2009-10-25 04:52:12

+0

@jack - 拼出foreach .... foreach(item in)$ collection(as)$ singular(do)等等。当你到达嵌套数组时,你试图把它看作单数,而它是另一个集合!该集合($ row [注释]在你的情况)需要传递给嵌套循环; foreach(item in)$ comments_collection(as)$ comment(do).... – deau 2009-10-25 05:00:14

0

变化

foreach($val as $val2) 
{ 
    echo $val['comments'].'<br>'; 
} 

foreach($val['comments'] as $val2) 
{ 
    echo $val2['comments'].'<br>'; 
} 
+0

谢谢..我试过这个,但我仍然得到:为​​foreach()以及未定义的索引提供了无效的参数。你知道为什么吗? – Jack 2009-10-25 04:43:32

相关问题