【问题标题】:PHP Bidimensional array and foreach loopsPHP 二维数组和 foreach 循环
【发布时间】:2011-07-23 16:58:03
【问题描述】:

我一直在努力解决二维数组和 foreach 循环。下面的代码展示了一个杂志数组,每个数组都指向一个一维的 Articles 数组。现在为每本杂志存储三篇文章(只是文章的标题)。我想知道如何关联一个二维数组,以便我可以存储除标题之外的作者和页码,对于属于杂志的每篇文章。你能指出我正确的方向吗?提前致谢。

<?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>";
}
?>

【问题讨论】:

    标签: php arrays foreach nested


    【解决方案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'];
      }
    }
    

    一点解释: Magazines 是一个普通的数组。 然后向其中添加关联数组(杂志)。 每个magzines-array 都有一个articles-field,它是一个普通数组,您可以再次将关联数组添加到它(文章)。

    所以现在,您遍历杂志,每本杂志都有一系列文章可供您迭代。

    这意味着:杂志是单个杂志的数组,一个杂志是一个关联数组,它还包含一个文章数组。文章又是一个关联数组。

    我希望这听起来不会太令人困惑... ;)

    【讨论】:

    • 听起来不错。但是,没有列出任何文章。另外,你忘记了 echo 'The Magazine ' $magazine['name'] 的句号
    • @Jorge 感谢您的提示。虽然我无法解释,但为什么文章数组是空的......我想某处有错字,因为它没有错 - 这就是我一直这样做的方式:) 我会努力解决这个问题!
    • 我也不是,但你的代码是我正在寻找的(当然工作;)哈哈。非常感谢您的宝贵时间。
    • @Jorge 好吧,我已经修复了代码 - 在填写文章时(或者通常,在循环中写入子数组时),您必须直接使用 & 引用 $magazine - 愚蠢的错误:-P
    • 哇...这真的很酷。非常感谢,非常感谢您的代码和您的时间。
    【解决方案2】:
    // 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,
    );
    

    【讨论】:

    • 两个问题。在我的真实代码中,我不知道我将拥有多少杂志和多少篇文章。这就是我使用 $magazines[] = 和 $articles[$magazine][] = 的原因。其次,我想了解如何使用嵌套的 foreach 进行操作。谢谢。
    • 您想对嵌套(也称为多维)数组做什么?在您的问题中,您还可以对它们进行操作,看起来不错。
    • 是的,但是我不知道如何在php中操作多个列。现在正在使用标题,但我还需要添加作者和页面。这是我通过在 Amazon S3 上迭代对象所做的更复杂的事情的一个简单示例。感谢您的关注。
    • Jorge,如果您在每篇文章中需要更多的值并且您想为此使用array,您需要另外添加它们。我会扩展答案。
    • 酷,我明白了。如何使用嵌套的 foreach 输出整个内容?问候。
    【解决方案3】:

    您需要将额外信息存储在杂志条目内的关联数组中:

    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"
            );
        }
    }
    

    【讨论】:

    • 谢谢。只有三件事,如果你得到那个输出,我想你上面还有一行来设置纯文本标题。也许像 header("Content-type: text/plain; charset=utf-8");其次,在我的真实示例中,我不知道我将拥有多少杂志和文章,这就是我在代码中使用 $magazines[] = 的原因。第三,我想了解的是如何使用嵌套的 foreach,print_r 非常适合调试,但对于输出目的没有任何帮助。谢谢。
    • @Jorge:我在 CLI shell 中运行示例,因此它们直接输出到控制台,而不是浏览器。如果您正在循环遍历未知数量的数组,您可以在while 循环中创建自己的计数器,或者仅使用[] 将元素标记到数值数组的末尾。关联数组需要一个唯一的键名,因此将名称构建为循环的一部分。我已经用替代输出更新了我的答案,以显示访问数组。我还添加了另一个创建数组的示例。
    • 好的,非常感谢。我将您用于创建数组的最后一个代码与嵌套的 foreach 混合在一起。我不知道这是否是我应该做的。无论如何,如果你这样做,输出会很奇怪! ;)
    • @Jorge:我认为您可能需要了解有关数组及其工作原理的更多信息。 manual 是一个不错的起点,但您也可以在 Internet 上搜索教程。
    【解决方案4】:

    我不确定我是否关注这里的问题。为什么不使用以下内容?

    $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
        }
    }
    

    这是 6 行干净的代码。

    【讨论】:

    • 我很感激。但是,我的观点是要了解如何正确操作数组,特别是如何使用嵌套的 foreach。
    • 我等了 10 多分钟才得到答复/澄清。我想你确实欠我一次机会。无论如何,编辑答案...
    【解决方案5】:

    怎么样:

    $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";
        }
    }
    

    【讨论】:

    • 嗯,谢谢,但我不知道你的数组 $magazines[$magazine] 与我的示例有什么关系。
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2013-05-06
    • 2012-03-22
    • 2010-10-24
    相关资源
    最近更新 更多