Объединение объектов в один div

210
19 декабря 2018, 09:20

Имеется вывод массива объектов:

<?php $compare = 0; ?>
<?php foreach($arr as $key => $value): ?>
            <?php if($compare != $value['id_storage']): ?>
            <ul class="box box-main box-<?php echo ($value['id_storage']); ?>">
                <div class="box-main-wrapper" style="display: flex; width: 100%;">
                    <li><?php echo ($value['id_storage']); ?></li>
                    <li><?php echo ($value['category_name']); ?></li>
                    <li><?php echo ($value['name_storage']); ?></li>
                    <li><?php echo ($value['mount']); ?></li>
                    <li><?php echo ($value['price']); ?></li>
                    <li><?php echo ($value['exp_date']); ?></li>
                    <li><input type="submit" class="btn btn-primary btn-details" value="Подробнее" style="align-self: center;"></li>
                    <?php  $compare = $value['id_storage']; ?>
                </div>
                <div class="sub-box-wrapper"></div>
            </ul>
            <?php else: ?>
                <ul class="hide box sub-box sub-box-<?php echo ($value['id_storage']); ?>">
                    <li><?php echo ($value['id_storage']); ?></li>
                    <li><?php echo ($value['category_name']); ?></li>
                    <li><?php echo ($value['name_storage']); ?></li>
                    <li><?php echo ($value['mount']); ?></li>
                    <li><?php echo ($value['price']); ?></li>
                    <li><?php echo ($value['exp_date']); ?></li>
                    <li></li>
                </ul>
            <?php endif ?>

При таком выводе в DOM-дереве ul с классом box-main создается первым, а ul с классом sub-box отдельно и ниже, чем ul с классом box-main. Как генерировать ul с классом sub-box внутри box-main, а точнее, внутри sub-box-wrapper ? Первый объект с 'id_storage' записывается в 'box-main', а остальные объекты с таким же 'id_storage' - в 'sub-box'.

Пример массива объектов $arr:

`Array
 (
    [0] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 2.22222e25
        [mount] => 2
        [exp_date] => 0000-00-00
    )
[1] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 800
        [mount] => 350
        [exp_date] => 2017-09-04
    )
[2] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 400
        [mount] => 8
        [exp_date] => 2017-09-01
    )
[3] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 0
        [mount] => 0
        [exp_date] => 0000-00-00
    )
[4] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 789
        [mount] => 136
        [exp_date] => 2018-09-10
    )
[5] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 0
        [mount] => 0
        [exp_date] => 0000-00-00
    )
[6] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 0
        [mount] => 0
        [exp_date] => 0000-00-00
    )
[7] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 32313
        [mount] => 1134
        [exp_date] => 2018-09-10
    )
[8] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 0
        [mount] => 0
        [exp_date] => 0000-00-00
    )
[9] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 1578
        [mount] => 16534
        [exp_date] => 2018-09-10
    )
[10] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 400
        [mount] => 20
        [exp_date] => 2017-09-02
    )
[11] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 500
        [mount] => 200
        [exp_date] => 2017-09-03
    )
[12] => Array
    (
        [id_storage] => 20
        [category_name] => Motherboard
        [name_storage] => MSI Z370 Gaming Plus (s1151, Intel Z370, PCI-Ex16)
        [price] => 0
        [mount] => 0
        [exp_date] => 0000-00-00
    )
[13] => Array
    (
        [id_storage] => 21
        [category_name] => Motherboard
        [name_storage] => Asus M5A78L-M LX3 (sAM3+, AMD 760G, PCI-Ex16)
        [price] => 123
        [mount] => 1
        [exp_date] => 2018-03-03
    )
[14] => Array
    (
        [id_storage] => 22
        [category_name] => CPU
        [name_storage] => Intel Core i7-8700K 3.7GHz/8GT/s/12MB
        [price] => 777
        [mount] => 459
        [exp_date] => 2018-09-30
    )
[15] => Array
    (
        [id_storage] => 22
        [category_name] => CPU
        [name_storage] => Intel Core i7-8700K 3.7GHz/8GT/s/12MB
        [price] => 123123
        [mount] => 11
        [exp_date] => 2018-09-10
    )
[16] => Array
    (
        [id_storage] => 22
        [category_name] => CPU
        [name_storage] => Intel Core i7-8700K 3.7GHz/8GT/s/12MB
        [price] => 1121
        [mount] => 22
        [exp_date] => 2018-03-09
    )
[17] => Array
    (
        [id_storage] => 23
        [category_name] => CPU
        [name_storage] => Intel Pentium G4500 3.5GHz/8GT/s/3MB
        [price] => 999
        [mount] => 111
        [exp_date] => 2018-09-10
    )
[18] => Array
    (
        [id_storage] => 24
        [category_name] => Monitor
        [name_storage] => Монитор 24" Samsung S24D300HS
        [price] => 1214440
        [mount] => 1232
        [exp_date] => 2018-01-02
    )
)
Answer 1

Изменяем структуру исходного массива, чтобы можно было его вывести в один проход:

<?php
$formated = [];
foreach ($arr as $item) {
    if (!array_key_exists($item['id_storage'], $formated)) {
        $formated[$item['id_storage']] = $item;
    } else {
       $formated[$item['id_storage']]['compare'][] = $item;
    }
 }
 ?>

А теперь выводим с учетом того, что товары для сравнения у нас помещены в подмассив compare:

<?php foreach($formated as $value): ?>
     <ul class="box box-main box-<?php echo ($value['id_storage']); ?>">
            <div class="box-main-wrapper" style="display: flex; width: 100%;">
                <li><?php echo ($value['id_storage']); ?></li>
                <li><?php echo ($value['category_name']); ?></li>
                <li><?php echo ($value['name_storage']); ?></li>
                <li><?php echo ($value['mount']); ?></li>
                <li><?php echo ($value['price']); ?></li>
                <li><?php echo ($value['exp_date']); ?></li>
                <li><input type="submit" class="btn btn-primary btn-details" value="Подробнее" style="align-self: center;"></li>
            </div>
            <div class="sub-box-wrapper">
             <?php if (array_key_exists('compare', $value)): ?>
                  <?php foreach($value['compare'] as $subitem): ?>
                      <ul class="hide box sub-box sub-box-<?php echo $subitem['id_storage']; ?>">
                            <li><?php echo ($subitem['id_storage']); ?></li>
                            <li><?php echo ($subitem['category_name']); ?></li>
                            <li><?php echo ($subitem['name_storage']); ?></li>
                            <li><?php echo ($subitem['mount']); ?></li>
                            <li><?php echo ($subitem['price']); ?></li>
                            <li><?php echo ($subitem['exp_date']); ?></li>
                            <li></li>
                      </ul>
                  <?php endforeach; ?>
             <?php endif; ?>
            </div>
        </ul>
 <?php endforeach; ?>
READ ALSO
Установка Google API

Установка Google API

Перейдем к сути вопроса мне необходимо использовать google api на своем веб сервере, для oauth 20 авторизации пользователя

180
Настроить форму php

Настроить форму php

Написал небольшой код, чтоб сообщения приходили на почту к заказчику, но по какой-то причине код не отрабатываетВсё внизу

159
&ldquo;Быки и коровы&rdquo;. Подскажите как правильно считать &ldquo;Коров&rdquo;

“Быки и коровы”. Подскажите как правильно считать “Коров”

Не могу придумать нормальный алгоритм для подсчета коров, программа при вводе двух одинаковых двузначных чисел("3 6 3 6"сравниваем с "3 6 7 5") считает...

194