Получить все изображения из каталога и отсортировать по два с помощью php

У меня есть слайдер, где я показываю два вертикальных изображения ( ссылка на изображение) одновременно и использую скользящий слайд, чтобы использовать слайдер - он работает нормально, но сейчас я пытаюсь кодировать что-то, что позволит мне просто указать в базе данных, какая папка выбрать изображения, а затем отсортировать каждые два в соответствующий шаблон.

Я думал о foreach функция сначала, но я не уверен, как кодировать это...

Так что я могу сделать? Я хочу повторить изображения в этом типе шаблона:

<div class="slider_image_div">
            <div class="slider_image_column">
            <img  class="image_slider_vertical" src="../images/portfolio/projects/icelandicmistadventure/1.jpg">
            </div>
            <div class="slider_image_column">
            <img  class="image_slider_vertical" src="../images/portfolio/projects/icelandicmistadventure/2.jpg">
            </div>
    </div>

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

Это мой код до сих пор:

$dir = '../images/portfolio/projects/icelandicmistadventures/';
$files2 = scandir($dir);
natsort($files2);

echo '<pre>'; print_r($files2); echo '</pre>';
echo $files2[3];

Что дает мне этот результат:

    Array
(
    [0] => .
    [1] => ..
    [2] => 1.jpg
    [3] => 10.jpg
    [4] => 11.jpg
    [5] => 12.jpg
    [6] => 13.jpg
    [7] => 14.jpg
    [8] => 15.jpg
    [9] => 16.jpg
    [10] => 2.jpg
    [11] => 3.jpg
    [12] => 4.jpg
    [13] => 5.jpg
    [14] => 6.jpg
    [15] => 7.jpg
    [16] => 8.jpg
    [17] => 9.jpg
)

Редактировать: мне удалось поместить выбранные изображения в массив, сгруппированный по числовому порядку (ключи не изменены, не уверен, имеет ли он какое-либо значение?) И в паре 2. Но я хочу получить доступ к массивам и сгруппировать их в двух с использованием array_chunk, так что в моем цикле я буду выводить два изображения в массиве, а не так, чтобы они были ВСЕ на отдельной, так сказать, "строке". Так что новый div создается после того, как эти два были выведены в HTML. Я не уверен, нужно ли мне считать или нет, но не похоже на аккуратное кодирование...

    Array
(
    [0] => Array
        (
            [9] => 1_icewall.jpg
            [10] => 2_leaningman.jpg
        )

    [1] => Array
        (
            [11] => 3_ledgeman.jpg
            [12] => 4_mightyfall.jpg
        )

Это код, который я пытался создать, но он просто выводит каждый массив на отдельной строке

    foreach($files2 as $x)
  {
 foreach($x as $group=>$image)
  {
      echo  "<br>" . $image . "<br>";
  }
  }

1 ответ

Решение

Вы можете использовать шар как glob("*.jpg") и тогда вам не понадобится фильтр.

Если вы хотите использовать scandir (как вы делаете сейчас) вы можете отфильтровать массив позже. После этого сравните название картинки в виде цифр, чтобы получить правильный порядок.

Рассмотрим следующий пример:

$arr = array(".", "..", "1.jpg", "11.jpg", "12.jpg", "2.jpg", "3.jpg");
function cmp($a, $b)
{
        $a = intval(substr($a, 0, -4)); // -4 is the length of ".jpg"
        $b = intval(substr($b, 0, -4));
        if ($a == $b)
                return 0;
        return ($a < $b) ? -1 : 1;
}
$arr = array_filter($arr, function($name) {return (substr($name, -4) === ".jpg");});
usort($arr, "cmp");

Это приведет к:

Array
(
    [0] => 1.jpg
    [1] => 2.jpg
    [2] => 3.jpg
    [3] => 11.jpg
    [4] => 12.jpg
)

редактировать

В качестве значения @kerbholz я предполагаю, что папка содержит только jpg - если у вас есть больше типов, измените код в качестве комментария.

Относительно кусков 2:

$chunksNum = 2;
$chunked = array_chunk($arr, $chunksNum);

// if you want to echo all of the file
foreach($chunked as $key => $chunk) {
    echo "Chunk $key: \n";
    foreach($chunk as $key => $value)
            echo "\t Picture $key: $value \n";
}

echo $chunked[1][0] . PHP_EOL; // if you want to get specific file 
                               // first index is the chunk num and second is the file num in chunk
Другие вопросы по тегам