2009-10-25 50 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

相關問題