Делать повторяющиеся элементы, если их меньше 4 и они не пустые

У меня есть слайдер для прокрутки изображений, и я добавляю все изображения в слайдер через php

Ситуация такова, что для работы слайдера нужно как минимум 4 изображения, и я написал соответствующий код, который копирует и вставляет изображения, если мы добавим только одно или два

Вот рабочий код

<?php if (count($images) < 4) { ?>
    <?php
    $images = array_merge($images, $images);
    $images = array_merge($images, $images);
    $images = array_slice($images, 0, 4);

    foreach ($images as $image) {
        if ($image->image_id) { ?>
            <div class = "slider-image">
                <img src = "<?= $image->url ?>" alt = "<?= $image->name ?>">
            </div>
        <?php } ?>
    <?php } ?>
<?php } ?>

И есть эта строка

if ($image->image_id)

То есть у меня может быть ситуация, что такого изображения нет в базе, и чтобы не было ошибок, я добавил соответствующую проверку

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

$images = array_merge($images, $images);
$images = array_merge($images, $images);
$images = array_slice($images, 0, 4);

Как учесть тот фактор, что картинки нет в базе и исправить код копирования? Или мне нужно использовать другую реализацию здесь?

🤔 А знаете ли вы, что...
PHP поддерживает расширения для работы с множеством сторонних сервисов и API.


1
52
1

Ответ:

Решено

Я предполагаю, что ваш $images не пуст и представляет собой обычный список (имеет последовательные индексы, начинающиеся с нуля). Просто заполните массив изображений в цикле следующим образом:

$images = [0,1];
$i = 0;
while( count( $images ) < 4 )
    $images[] = $images[ $i++ ];


print_r($images); # [0,1,0,1]


/*
For given initial arrays we will get following results:

[0] -> [0,0,0,0]
[0,1] -> [0,1,0,1]
[0,1,2] -> [0,1,2,0]
[0,1,2,3] -> [0,1,2,3]
*/

Если у вас есть фиктивные объекты изображений, сначала отфильтруйте их:

$images = array_filter($images, fn($image) => !empty($image->image_id) );