Извлечение изображений на основе идентификатора
У меня есть слайдер (flexslider), который я использую для отображения изображений в форме, показанной ниже в jsfiddle... Я оптимизировал слайдер, чтобы он извлекал изображения динамически из определенного каталога. Он работал, и все изображения извлекаются.
Теперь в моей папке изображения называются 1023, 2045, 304654, 50 и т.д....
Как я могу указать, что изображения, которые начинаются с разрешения "1" (может быть 14, 1040, 10000.100000 и т.д.), Являются только извлеченными?
Обновление (более подробное пояснение): причина, по которой я извлекаю на основе первой цифры имени каждого изображения, заключается в том, что я собираюсь использовать ползунок во всех элементах моего меню. Таким образом, если я нажимаю на элемент "aaaa", изображения, начинающиеся с 1, появляются, если я нажимаю на "bbbbbb" изображения, начинающиеся с 2, и т.д.
JSFIDDLE: https://jsfiddle.net/atkumqpk/1/
PHP-код:
function get_slide_images($folder, $images_per_slide = 10)
{
$slide_images = false;
if (file_exists($folder)) {
// valid extensions
$extensions = array(
"jpg",
"gif",
"jpeg",
"svg",
"png",
"bmp"
);
foreach (new DirectoryIterator($folder) as $file_key => $file) {
// Don't bother
if (!in_array($file->getExtension(), $extensions)) {
continue;
}
// Grab file details
$filename = $file->getFilename();
$file_folder = $folder . "/" . $filename;
// Store the image to the Slide
$slide_images[$filename] = "<img src='{$file_folder}' alt='{$file_folder}' />";
}
if (!empty($slide_images)) {
ksort($slide_images);
$slide_images = array_chunk($slide_images, $images_per_slide);
}
}
return $slide_images;
}
//end of php
<div id="logo" class="logo" ><img src="logo.png"/></div>
<p class="custom-class"><a href="">Go to the main website</a></p>
<div id="menu" class="menu">
<ul class="headlines">
<li id="item1">
<button>aaaaaaaa</button>
</li>
<li id="item2">
<button>bbbbbbb</button>
</li>
<li id="item3">
<button>ccccccc</button>
</li>
<li id="item4">
<button>dddddddd</button>
</li>
<li id="item5">
<button>eeeeeee eee.</button>
</li>
<li id="item6">
<button>ffffff</button>
</li>
<li id="item7">
<button>ggggggg</button>
</li>
</ul>
</div>
<div id="container">
<div id="first" class="inner-container">
<div id="item11" class="item"> <a name="item11"></a>
<div class="flexslider">
<ul class="slides">
$slider_kvp = get_slide_images("images", 10);
/**
* Here we are going to generate the SLIDES
*/
if($slider_kvp) {
$slider_list_html = array();
foreach($slider_kvp as $slider_key => $slide_images) {
$html_LI_list = "";
$html_LI_list = "<li>";
// Go through each image ...
foreach($slide_images as $image_key => $image_value) {
$html_LI_list .= $image_value;
}
$html_LI_list .= "</li>";
$slider_list_html[$slider_key] = $html_LI_list;
}
// OUR SLIDES!
$rendered_slider_list_html = implode(' ', $slider_list_html);
echo "<ul class='slides'>{$rendered_slider_list_html}</ul>";
}
</ul>
</div>
</div>
</div>
<div id="second" class="inner-container">
<div id="item22" class="item"> <a name="item22"></a>
<div class="flexslider">
<ul class="slides">
$slider_kvp = get_slide_images("images", 10);
/**
* Here we are going to generate the SLIDES
*/
if($slider_kvp) {
$slider_list_html = array();
foreach($slider_kvp as $slider_key => $slide_images) {
$html_LI_list = "";
$html_LI_list = "<li>";
// Go through each image ...
foreach($slide_images as $image_key => $image_value) {
$html_LI_list .= $image_value;
}
$html_LI_list .= "</li>";
$slider_list_html[$slider_key] = $html_LI_list;
}
// OUR SLIDES!
$rendered_slider_list_html = implode(' ', $slider_list_html);
echo "<ul class='slides'>{$rendered_slider_list_html}</ul>";
}
</ul>
</div>
</div>
</div>
Ответы
Ответ 1
Существуют различные способы достижения этого, но один из способов - отфильтровать имена файлов, которые выполняет ваша функция. Вместо блока foreach (new DirectoryIterator($folder) as $file_key => $file) { ... }
вы можете сделать что-то вроде:
foreach (glob($folder.'/'.'1*') as $filename) {
$slide_images[$filename] = "<img src='{$filename}' alt='{$filename}' />";
}
бит glob
соответствует всем внутри $folder
, который начинается с "1" (вы также можете ограничить его, скажем, PNG, указав, например, "1 *.png" )
Это имеет то преимущество, что вы смотрите только на файлы, которые вам действительно нужны, что более эффективно, чем альтернативный подход к итерации через все и просмотр его имени файла.
Обновление:, если вы хотите изменить фильтр "начинается с" (поэтому он не всегда "1" ), вы можете добавить дополнительный аргумент к своей функции, например:
function get_slide_images($folder, $images_per_slide = 10, $starts_with = '') {
... и затем измените часть foreach
(см. выше), чтобы она ее использовала:
foreach (glob("{$folder}/{$starts_with}*") as $filename) {
... тогда вы можете вызвать свою функцию следующим образом:
$slider_kvp = get_slide_images("images", 10, "1");
... где третий аргумент ( "1" ) указывает, с чего должны начинаться файлы, которые вы хотите. (Если вы вызываете функцию без третьего аргумента, вы получите все файлы в папке, как вы сейчас это делаете). Таким образом, ваша функция get_slide_images
может выглядеть примерно так:
function get_slide_images($folder, $images_per_slide = 10, $starts_with = '')
{
$slide_images = false;
// valid extensions
$extensions = array(
"jpg",
"gif",
"jpeg",
"svg",
"png",
"bmp"
);
// Implode the extensions array into a string:
$extensions = implode(',', $extensions);
if (file_exists($folder)) {
// Get all the files with a valid extension in $folder:
// (optionally filtered by $starts_with)
foreach (glob($folder.'/'.$starts_with.'*.{'.$extensions.'}', GLOB_BRACE) as $filename) {
$slide_images[$filename] = "<img src='{$filename}' alt='{$filename}' />";
}
if (!empty($slide_images)) {
ksort($slide_images);
$slide_images = array_chunk($slide_images, $images_per_slide);
}
}
return $slide_images;
}
Ответ 2
Разве это не решение этого, а не просто его фильтрация на стороне сервера?
Чтобы сделать функцию более гибкой (вместо фильтрации только 1):
<?php
function get_slide_images($folder, $images_per_slide = 10, $pattern = "")
{
$slide_images = false;
if (!file_exists($folder))
return $slide_images;
// valid extensions
$extensions = array(
"jpg",
"gif",
"jpeg",
"svg",
"png",
"bmp"
);
foreach (new DirectoryIterator($folder) as $file_key => $file) {
// Don't bother
if (!in_array($file->getExtension(), $extensions))
continue;
// Grab file details
$filename = $file->getFilename();
if ($pattern && !preg_match($pattern, $filename))
continue;
$file_folder = $folder . "/" . $filename;
// Store the image to the Slide
$slide_images[$filename] = "<img src='{$file_folder}' alt='{$file_folder}' />";
}
if (!empty($slide_images)) {
ksort($slide_images);
$slide_images = array_chunk($slide_images, $images_per_slide);
}
return $slide_images;
}
и теперь вы можете запустить его с помощью:
get_slide_images('images',10,'/^1/'); // get everything starting with 1
get_slide_images('images',10,'/^1234/'); // get everything starting with 1234
надеюсь, что это то, что вы ищете.
Ответ 3
Если вам нужно условие для проверки:
<?php
function starts_with ($filename, $start)
if (substr($filename, 0, 1) == $start)
return true;
return false;
}
?>
Ответ 4
в php, я просто проверю
if ("1" !== substr($filename, 0, 1)) {
continue;
}
во время DirectoryIterator