Эхо списка каталогов с фильтрацией массива

Этот фрагмент кода работает:

<?php
header('Access-Control-Allow-Origin: *');
$imagesDir = '';
$images = glob($imagesDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
echo json_encode($images, JSON_UNESCAPED_UNICODE);
?>

Я получаю правильное эхо всех файлов jpg в папке, которое выглядит так:

[
    "20180515_xxxxxxx.jpg",
    "20180517_yyyyyyy.jpg",
    "20180519_zzzzzzzz.jpg"
]

Но я хочу выполнить определенную фильтрацию по дате (только изображения, имя которых начинается с даты> =, чем сегодня), потому что все имена файлов jpg начинаются с yyyymmdd в своем имени.

Я пробую что-то вроде этого:

<?php
header('Access-Control-Allow-Origin: *');
$imagesDir = '';
$images = glob($imagesDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);

foreach($images as $image) {
    $current_date = date("Ymd");
    $file_date = substr($image, 0, 8);
    if (strcmp($current_date, $file_date)>=0)
    echo json_encode($image, JSON_UNESCAPED_UNICODE);
    }
?>

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

Каков ваш ожидаемый результат? Пожалуйста, прочтите как спросить и mvce.

k0pernikus 17.05.2018 17:21

Ой, извините ... моя ошибка. Я хочу отфильтровать только изображения, имя которых начинается с даты> =, чем сегодня

vixus 17.05.2018 21:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы выводите строку JSON для каждого изображения.

Вместо этого:

foreach($images as $image) {
    $current_date = date("Ymd");
    $file_date = substr($image, 0, 8);
    if (strcmp($current_date, $file_date)>=0)
        echo json_encode($image, JSON_UNESCAPED_UNICODE);
}

Попробуйте добавить массив и собрать их.

$filteredImages = [];
foreach($images as $image) {
    $current_date = date("Ymd");
    $file_date = substr($image, 0, 8);
    if (strcmp($current_date, $file_date)>=0)
        $filteredImages[] = $image
}
echo json_encode($filteredImages, JSON_UNESCAPED_UNICODE);

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

У вас есть массив, и вы хотите его отфильтровать.

Есть встроенная функция array_filter, которая принимает массив, и вы можете предоставить функцию обратного вызова.

Кроме того, я рекомендую преобразовать дату в фактический объект DateTime. Преимущество заключается в том, что вы можете сравнивать DateTimes в операторах if со всеми операторами сравнения:

<?php

function parseDate(string $date, $format = "Ymd")
{
    return DateTime::createFromFormat($format, $date)
        ->setTime(0, 0, 0);
}

$today = (new DateTime())->setTime(0, 0);
$filterCallback = function (string $file) use ($today): bool {
    $rawDate = explode("_", $file)[0]; // assumes all your date in the filename are followed up by at least one underscore
    $date = parseDate($rawDate);

    return $date >= $today;
};

$files = [
    "20180515_xxxxxxx.jpg",
    "20180517_yyyyyyy.jpg",
    "20180519_zzzzzzzz.jpg",
    "20250519_zzzzzzzz.jpg",
];

$filteredFiles = array_filter($files, $filterCallback);

foreach ($filteredFiles as $file) {
    echo "$file\n";
}

Выведет:

20180519_zzzzzzzz.jpg
20250519_zzzzzzzz.jpg

Другие вопросы по теме