2015-12-01 4 views
0

Я пытаюсь создать простой цикл foreach, который будет группировать каждые 16 записей в массиве. У меня есть также другой счетчик ($ s), которые мне нужно быть сброшен после 4.Сброс счетчика внутри цикла foreach

Вот мой код

$a = array(
    'book-1' => 'Book Title 1', 
    'book-2' => 'Book Title 2', 
    'book-3' => 'Book Title 3', 
    'book-4' => 'Book Title 4', 
    'book-5' => 'Book Title 5', 
    'book-6' => 'Book Title 6', 
    'book-7' => 'Book Title 7', 
    'book-8' => 'Book Title 8', 
    'book-9' => 'Book Title 9' 
); 

$i = 1; 
$bookshelf = 1; 
$s=0; 
foreach ($a as $k => $v) 
{ 

    if ($i == 9 || $i == 1) 
    { 
     echo '<div id="bookshelf-'.$bookshelf.'"></div>'; 
     $bookshelf++; 
    } 


    if ($i%4 == 1) 
    { 
     echo '<div class="bookshelf-bottom">'; 
    } 

    if ($i > 5) 
    { 
     $s=0; 
    } 

    $s++; 

    echo '<div class="book-frame-'.$s.'">'.$v.'</div>'; 

    if ($i%4 == 0) 
    { 
     echo '</div>'; 
    } 

    $i++; 
} 
if ($i%4 != 1) echo '</div>'; 

То, что я пытаюсь экспортирующим:

<div id="bookshelf-1" class="bookshelf-top"></div> 

<div class="bookshelf-bottom"> 
<div class="book-frame-1">Book Title 1</div> 
<div class="book-frame-2">Book Title 2</div> 
<div class="book-frame-3">Book Title 3</div> 
<div class="book-frame-4">Book Title 4</div> 
</div> 

<div class="bookshelf-bottom"> 
<div class="book-frame-1">Book Title 5</div> 
<div class="book-frame-2">Book Title 6</div> 
<div class="book-frame-3">Book Title 7</div> 
<div class="book-frame-4">Book Title 8</div> 
</div> 

<div class="bookshelf-bottom"> 
<div class="book-frame-1">Book Title 9</div> 
</div> 
+1

Aaaand .... вопрос заключается? – AdamJeffers

+0

нигде вы не делаете '$ i = 1' после первой инициализации ... –

ответ

1

Взгляните

<?php 
$a = array(
    'book-1' => 'Book Title 1', 
    'book-2' => 'Book Title 2', 
    'book-3' => 'Book Title 3', 
    'book-4' => 'Book Title 4', 
    'book-5' => 'Book Title 5', 
    'book-6' => 'Book Title 6', 
    'book-7' => 'Book Title 7', 
    'book-8' => 'Book Title 8', 
    'book-9' => 'Book Title 9' 
); 

$i = 1; 
$bookshelf = 1; 
$s=0; 
foreach ($a as $k => $v) { 
    $s++; 
    if ($i == 9 || $i == 1) { 
     if($i == 1) 
      echo '<div id="bookshelf-'.$bookshelf.'" class="bookshelf-top"></div>'; 
     else 
      echo '<div id="bookshelf-'.$bookshelf.'"></div>'; 
     $bookshelf++; 
    } 
    if($s == 1) 
     echo '<div class="bookshelf-bottom">'; 
    echo '<div class="book-frame-'.$s.'">'.$v.'</div>'; 
    if($s == 4) { 
     echo '</div>'; 
     $s = 0; 
    } 
    $i++; 
} 
?> 
+0

Кстати, книжная полка не написана надлежащим образом, потому что она статична как 1 или 9 - если вам это нужно, так как каждый 9 записей говорят мне, пожалуйста –

0

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

$a = array(
    'book-1' => 'Book Title 1', 
    'book-2' => 'Book Title 2', 
    'book-3' => 'Book Title 3', 
    'book-4' => 'Book Title 4', 
    'book-5' => 'Book Title 5', 
    'book-6' => 'Book Title 6', 
    'book-7' => 'Book Title 7', 
    'book-8' => 'Book Title 8', 
    'book-9' => 'Book Title 9' 
); 

$i = 1; 
$bookshelf = 1; 
foreach (array_chunk($a, 4) as $section) 
{ 
    echo '<div class="bookshelf-bottom">'; 
    foreach($section as $k => $v) 
    { 
     // Output this for the first and last item. I'd recommend taking this out of the foreach or restructuring this somehow to avoid the manual check. 
     if ($i == 9 || $i == 1) 
     { 
      echo '<div id="bookshelf-'.$bookshelf.'"></div>'; 
      $bookshelf++; 
     } 
     $i++; 

     // Output this book. 
     echo '<div class="book-frame-'.$s.'">'.$v.'</div>'; 
    } 
    echo '</div>'; 
} 

Это использует array_chunk для создания разделов, а затем перебирает секции, чтобы сделать HTML.

EDIT: Если вы хотите включить полный массив с большим количеством значений и больше HTML-кода, который вам нужен, я был бы рад изменить этот foreach и объяснить, как он работает.

Смежные вопросы