Два цикла foreach в один в PHP?

Учитывая следующее:

$arrayone = array('Title one', 'Title two');
$arraytwo = array('Content one', 'Content two');

Как бы я поместил следующее:

<h2>Title one</h2>
<p>content one</p>

<h2>Title two</h2>
<p>content two</p>

Я мог бы сделать вложенный foreach следующим образом:

foreach ($arrayone as $key => $value) {
    echo "<h4>$value</h4>";
    foreach ($arraytwo as $keysub => $valuesub) {
        # code...
        if($keysub === $key) {
            echo "<p>$valuesub</p>";
        }
    }
}

который отлично работает, но я думаю, что это не самый эффективный способ, поскольку он проходит через второй массив для каждого элемента в первом... Это не кажется правильным.

Как сделать его более эффективным?


person vimes1984    schedule 29.08.2014    source источник
comment
Поскольку вы не используете ассоциативные массивы, предпочтительным методом будет цикл for, преимущество которого заключается в меньшем объеме памяти.   -  person Jasper    schedule 30.08.2014


Ответы (4)


Используйте разумную структуру данных:

$content = array_map(null, $arrayone, $arraytwo);

foreach ($content as $entry) {
    printf('<h2>%s</h2>', $entry[0]);
    printf('<p>%s</p>', $entry[1]);
}

Или даже:

$content = array_combine($arrayone, $arraytwo);

foreach ($content as $title => $body) {
    printf('<h2>%s</h2>', $title);
    printf('<p>%s</p>', $body);
}
person deceze♦    schedule 29.08.2014

Вы можете просто использовать один цикл for:

for ($i = 0; $i < count($titlesArray); $i++) {
    echo "<h1>".$titlesArray[$i]."<h1>";
    echo "<p>".$paragraphsArray[$i]."</p>";
}
person MC Emperor    schedule 29.08.2014

Предполагая, что вы правильно настроили массивы, чтобы всегда иметь одинаковый порядок и количество элементов:

for($i = 0; $i < count($arrayone); $i++) {
  echo "<h4>{$arrayone[$i]}</h4>";
  echo "<p>{$arraytwo[$i]}</p>";
}

Однако вам лучше использовать более разумный формат массива:

$array = [
  ['title' => 'Title one', 'content' => 'Content one'],
  ['title' => 'Title two', 'content' => 'Content two'],
];
person ceejayoz    schedule 29.08.2014
comment
ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа я и не знал, что могу сделать так намного чище! - person vimes1984; 30.08.2014

Поскольку все очевидные ответы уже опубликованы, вот еще один способ сделать это.

foreach (array_combine($arrayone, $arraytwo) as $title => $content) {
    printf('<h2>%s</h2><p>%s</p>', $title, $content);
}
person Rob    schedule 29.08.2014