2013-03-04 2 views
2

Мои данные взяты из базы данных и были grouped byday_id, поэтому массив отсортирован по day_id.Выходная логика html из массива

Код + образец, предоставленный, тип трудно выразить словами.

Я получил свое вдохновение от this accepted answer, но мне нужна небольшая корректировка.

$array = array(
      0 => array(
       'id' => '5', 
       'day_id' => '1', 
       'Foo' => array(
        'id' => '28', 
        'name' => 'My day_id is 1' 
       ) 
      ), 
      1 => array(
       'id' => '6', 
       'day_id' => '1', 
       'Foo' => array(
         'id' => '29', 
         'name' => 'My day_id is 1' 
       ) 
      ), 
      2 => array(
       'id' => '7', 
       'day_id' => '2', 
       'Foo' => array(
        'id' => '30', 
        'name' => 'My day_id is 2' 
       ) 
      ),  
      3 => array(
       'id' => '8', 
       'day_id' => '3', 
       'Foo' => array(
         'id' => '31', 
         'name' => 'My day_is 3' 
       ) 
      ) 
); 

И мой код, чтобы вывести его:

$day = 0; 
foreach($array as $a) { 

    // $a['day_id'] = 1, condition is true. output header once. 
    if($day != $a['day_id']) { 
     echo '<h3>The Day is ' . $a['day_id'] . '</h3>' . "\n"; 
    } 

    // output the elements Foo key content. 
    echo $a['Foo']['name'] . "\n"; 

    // store the current value to compare on the next iteration 
    // $a['day_id'] will eventually be 2, causing the condition to fire again. 
    $day = $a['day_id']; 
} 

Это выходы:

<h3>The Day is 1</h3> 
My day_id is 1 
My day_id is 1 

<h3>The Day is 2</h3> 
My day_id is 2 

<h3>The Day is 3</h3> 
My day_is 3 

Теперь я хочу, чтобы обернуть каждый "день" в DIV, но я не могу понять, логика. Если я заменил <h3> на открытый div, я не знаю, где положить закрытие </div>. Мои попытки до сих пор приводили к тому, что каждый день имел div open, но не закрытый, поэтому они были вложенными, а не отдельными.

Я не могу поставить </div><div class="day-X">, так как в начале будет </div>, который нарушил бы макет.

Желаемый результат:

<div class="day-1"> 
    <h3>The Day is 1</h3> 
    My day_id is 1 
    My day_id is 1 
</div> 
<div class="day-2"> 
    <h3>The Day is 2</h3> 
    My day_id is 2 
</div> 

<div class="day-3"> 
    <h3>The Day is 3</h3> 
    My day_is 3 
</div> 

Надеется, что это имеет смысл - благодаря

+0

проверить мой ответ – Othman

+0

+1 для предоставления полезной PHP массив! – Cups

+0

вам нужно сохранить дни, а затем проверить массив. Я обновил свой ответ, используя небольшой массив дней + уникальный. – Othman

ответ

2

Вы должны петлям дважды, один для дня и один для элементов, которые имеют этот день. Без использования каких-либо других SQL-запросов вам нужно сначала сохранить дни в массиве. то вы можете зацикливаться на днях, и каждый день вы будете эхом отвечать на <div> и заголовок дня, в конце вы будете эхом от </div>.

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

Я протестировал этот код, вы можете проверить его и сообщить мне, если у вас возникли проблемы с ним.

foreach($array as $day){ 
    $days[] = $day['day_id']; // store all the days in an array 
} 
    // now days[] has [1,1,2,3] 

$days = array_unique($days); // get unique days only no duplicated 

    //now days[] has [1,2,3] 


foreach($days as $d){ // for each day 

    echo '<div class = "day-'.$d.'">'; 
    echo '<h3>The Day is ' . $d . '</h3>' . "\n"; 

    foreach($array as $a) { // check all other items if the item has the same day then echo 

     if($a['day_id'] == $d){ 

      echo $a['Foo']['name'] . "\n"; 
     } 
    } 

    echo '</div>'; 

} 

Выход:

<div class = "day-1"> 
    <h3>The Day is 1</h3> 
     My day_id is 1 
     My day_id is 1 
</div> 

<div class = "day-2"> 
    <h3>The Day is 2</h3> 
     My day_id is 2 
</div> 

<div class = "day-3"> 
    <h3>The Day is 3</h3> 
     My day_is 3 
</div> 
+0

Это прекрасно работает - спасибо – user19284129

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