Двумерный массив PHP и циклы foreach - PullRequest
2 голосов
/ 23 июля 2011

Я следую за борьбой с двумерными массивами и циклами foreach. Следующий код показывает массив журналов, каждый из которых указывает на одномерный массив статей. Прямо сейчас хранится три статьи для каждого журнала (только название статьи). Я хотел бы знать, как связать двумерный массив, чтобы я мог хранить Author и PagesNumber помимо заголовка для каждой статьи, принадлежащей журналу. Не могли бы вы указать мне правильное направление? Заранее спасибо.

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

Ответы [ 5 ]

1 голос
/ 23 июля 2011

Может быть, вы должны структурировать его немного иначе:

$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 есть поле статей, которое является обычным массивом, к которому вы снова добавляете ассоциативные массивы (статьи).

Итак, теперь вы перебираете журналы, и у каждого журнала есть массив статей, которыеВы можете повторить.

Это означает: Журналы - это массив отдельных журналов, один журнал - это ассоциативный массив, который также содержит массив статей.Статья снова является ассоциативным массивом.

Надеюсь, это звучит не слишком запутанно ...;)

1 голос
/ 23 июля 2011

Я не уверен, что следил за проблемой здесь.Почему бы не использовать следующее?

$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() на хорошее именование.Вы можете легко преобразовать это (или что-то подобное) в ООП.В конце концов, ООП предназначен только для управления предметами.Фактическим хранилищем всегда является массив.


Обход

Считывание массива на самом деле довольно просто, если вы имеете правильную структуру:

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

Это 6 строк чистого кода.

1 голос
/ 23 июля 2011

Вам необходимо сохранить дополнительную информацию в ассоциативном массиве в записи журнала:

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"
        );
    }
}
1 голос
/ 23 июля 2011
// 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 голосов
/ 23 июля 2011

как насчет:

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