2011-07-23 43 views
2

我跟着掙扎與二維數組和foreach循環。下面的代碼顯示了一個雜誌數組,每個數組都指向一個單維的Articles數組。現在正在爲每本雜誌存儲三篇文章(只是文章的標題)。我想知道如何關聯Bidimensional數組,以便我可以存儲除了標題以外的作者和PagesNumber,以查找屬於雜誌的每篇文章。你能指出我正確的方向嗎?提前致謝。PHP二維數組和foreach循環

<?php 

// Create a magazines array 
$magazines = array(); 

// Put 5 magazines on it 
for($x=0;$x<5;$x++) 
    $magazines[] = "Magazine " . $x ; 

// Associate articles array to each magazine 
foreach($magazines as $magazine){ 
    $articles[$magazine] = array(); 
    for($x=0;$x<3;$x++) 
     $articles[$magazine][] = $magazine . " - Article Title " . $x ; 
} 

// List them all 
foreach($magazines as $magazine){ 
    echo $magazine . " has these articles: <br>"; 
    foreach($articles[$magazine] as $article) 
     echo $article . "</br>"; 
} 
?> 

回答

1

也許你應該構建它有一點不同:

$magazines = array(); 

//create magazines 
for($x=0;$x<5;$x++) { 
    $magazines[] = array('name' => 'Magazine ' . $x, 
         'year' => '2011', 
         'articles' => array()); 
} 

//fill in some articles 
foreach ($magazines as &$magazine) { 
    for($x=0;$x<3;$x++) { 
    $magazine['articles'][] = array('article_titel' => $magazine['name'] . " - Article Title " . $x, 
            'article_author' => 'author ' . $x, 
            'article_page' => $x); 
    } 
} 

//output 
foreach($magazines as $magazine) { 
    echo 'The Magazine ' . $magazine['name'] . ' from ' . $magazine['year'] . ' contains the articles : '; 
    foreach($magazine['articles'] as $article) { 
    echo $article['article_titel'] . ' by ' . $article['article_author'] . ' on page ' . $article['article_page']; 
    } 
} 

一點的解釋: 雜誌是一個正常的數組。 然後你添加關聯數組(雜誌)。 每個magzines數組都有一個articles-field,它是一個普通的數組,可以將關聯數組添加到(文章)中。

所以,現在,你迭代通過雜誌,每個雜誌有一系列的文章,你可以迭代。

這意味着:雜誌是一個單雜誌陣列,一個雜誌是一個關聯數組,其中也包含一系列文章。文章再次是一個關聯數組。

我希望這聽起來不是太混亂...;)

+0

聽起來不錯。但是,沒有列出任何文章。此外,你忘了回聲'雜誌'$ magazine ['name'] – Jorge

+0

@Jorge謝謝你的提示。儘管我無法解釋,爲什麼articles-array是空的......我猜在某處有個錯字,因爲它沒有錯 - 這就是我總是這樣做的:)我會試着修復它! – Quasdunk

+0

我也沒有,但你的代碼是我正在尋找(當然工作;)大聲笑。非常感謝您的時間。 – Jorge

0

怎麼樣:

$magazines[$magazine] = array(); 
$magazines[$magazine]['article']['title'] = 'title'; 
$magazines[$magazine]['article']['other'] = 'other'; 

foreach ($magazines as $name => $magazine) { 
    echo "name: " . $name; 
    foreach ($magazine as $articleName => $article) { 
     echo "title: " . $article['title'] . "\n"; 
     echo "other: " . $article['other'] . "\n"; 
    } 
} 
+0

好了,謝謝你,但我不知道你的數組$雜誌[$週刊】如何關係到我的例子。 – Jorge

1

您需要存儲額外的信息在雜誌條目中的關聯數組:

for ($m = 0; $m < 5; $m++) { 
    for ($a = 0; $a < 3; $a++) { 
     $magazines["Magazine $m"]["Article $a"] = array(
      'title' => "Title $a", 
      'author' => "Author $a" 
     ); 
    } 
} 

然後,您可以訪問每個元素的數組中多種方式:

// foreach loops through each element of the array, 
// returning the key and value: 
foreach ($magazines as $magazine => $articles) { 
    print "$magazine\n"; 
    foreach ($articles as $article => $info) { 
     print " $article\n"; 
     // You can also access elements directly by their key: 
     print " Title: {$info['title']}\n"; 
     print " Author: {$info['author']}\n"; 
    } 
} 

結果:

Magazine 0 
    Article 0 
    Title: Title 0 
    Author: Author 0 
    Article 1 
    Title: Title 1 
    Author: Author 1 
    Article 2 
    Title: Title 2 
    Author: Author 2 
Magazine 1 
    Article 0 
    Title: Title 0 
    Author: Author 0 
    ... 

有創建嵌套陣列的方法很多,而選擇取決於您的要求。以上方法只使用關聯數組,而下面的使用這兩種關聯數組和數字陣列:

$magazines = array(); 

for ($m = 0; $m < 5; $m++) { 
    $magazines[$m] = array('title' => "Magazine $m"); 
    for ($a = 0; $a < 3; $a++) { 
     $magazines[$m]['articles'][] = array(
      'title' => "Article $a", 
      'author' => "Author $a" 
     ); 
    } 
} 
+0

謝謝。只有三件事,如果你得到那個輸出,我想你上面有另外一行來設置純文本標題。也許像header(「Content-type:text/plain; charset = utf-8」);其次,在我的真實例子中,我不知道我會有多少雜誌和文章,這就是我在我的代碼中使用$ magazines [] =的原因。第三,我想了解的是如何使用嵌套的foreach,print_r非常適合調試,但在輸出方面沒有任何幫助。謝謝。 – Jorge

+0

@Jorge:我在CLI shell中運行示例,因此它們直接輸出到控制檯,而不是瀏覽器。如果循環使用未知數量的數組,則可以在'while'循環中創建自己的計數器,或者僅使用'[]'將元素標記到數組的末尾。關聯數組需要一個唯一的鍵名,因此將該名稱構建爲循環的一部分。我已經用替代輸出更新了我的答案,以顯示訪問數組。我還添加了另一個創建數組的例子。 – Mike

+0

好的,非常感謝。我將最後一個用於創建數組的代碼與嵌套的foreach混合在一起。我不知道我是否應該這樣做。無論如何,如果你這樣做,輸出是非常奇怪的! ;) – Jorge

1
// 5 articles per magazine: 
$articles = array_combine($magazines, array_fill(0, 5, array(1,2,3,4,5)); 

你現在有每個雜誌的5篇文章都與一個數字作爲自己的冠軍。只是爲了演示。希望能幫助到你。您可以通過$articles陣列訪問所有文章,然後提供雜誌標題作爲關鍵。

當然,你可以爲每本雜誌的文章以及手動:

$articles[$magazine] = array('My first article', 'Editorial', 'Cooking with wood fire'); 

甚至個別:

$articles[$magazine][] = 'Learning by doing.'; 

編輯:如果一篇文章有​​更多的邀約,則標題:

$articles[$magazine][] = array 
(
    'title' => 'Learning by doing.', 
    'author' => 'Frank Stein', 
    'pages' => 2, 
); 
+0

有兩個問題。在我的真實代碼中,我不知道有多少雜誌和多少篇文章。這就是我使用$雜誌[] =和$ articles [$ magazine] [] =的原因。其次,我想了解如何使用嵌套的foreach進行操作。謝謝。 – Jorge

+0

你想用嵌套(也稱爲多維)數組做什麼?在你的問題中,你也可以對它們進行操作,看起來不錯。 – hakre

+0

是的,但我不知道如何在php中使用多個列。目前正在使用Title,但我也需要添加Author和Pages。這是通過在Amazon S3上迭代對象來實現更復雜的一個簡單示例。感謝您的關注。 – Jorge

1

我不確定我是否遵循iss你在這裏。爲什麼不使用以下內容?

$magazines = array(

    array(// a single magazine 
     'title' => 'Issue 1', 
     'articles' => array(// a list of articles 
      array(// a single article 
       title => 'Article 1', 
       content => 'xyz' 
      ) 
     ) 
    ), 

); 

編輯:固定的小失誤:)

如果你想讓它更可讀的方式,你可以這樣做:

function Magazines(){ 
    return func_get_args(); 
} 

function Magazine($title,$articles){ 
    return array(
     'title' => $title, 
     'articles' => $articles 
    ); 
} 

function Articles(){ 
    return func_get_args(); 
} 

function Article($title,$content){ 
    return array(
     'title' => $title, 
     'content' => $content 
    ); 
} 

// and using it... 
$magazines = Magazines(Magazine('Issue 1',Articles(Article('Article 1','xyz')))); 

它只是取代了array()一些好的命名。您可以輕鬆地將此(或類似的)轉換爲OOP。最後,OOP僅用於管理項目。實際的存儲總是一個數組。


穿越

通過陣列中讀其實原因很簡單,一旦你有正確的結構:

foreach($magazines as $magazine){ 
    // user things like $magazine['title'] in here... 
    foreach($magazine['articles'] as $article){ 
     // user $article['title'] here 
    } 
} 

這是行乾淨的代碼。

+0

我很感激。不過,我的觀點是要理解如何正確操作數組,特別是如何使用嵌套的foreach進行操作。 – Jorge

+0

我已經等了10多分鐘回覆/澄清。我想你應該給我第二次機會。無論如何,編輯答案... – Christian