从目录中获取所有图像并使用 php 两两排序
Fetch all images from dir and sort two by two using php
我有一个滑块,我可以在其中同时显示两个垂直图像 (image reference),并且我正在使用 slick slide 来使用滑块 - 它工作正常,但我现在正在尝试编写一些可以让我使用的代码只需在数据库中指定从哪个文件夹中选择图像,然后将每两个图像分类到适当的模板中。
我首先想到了 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 这样在我的循环中我将回显数组中的两个图像,而不是将它们全部放在一个单独的 "line" 可以这么说..所以一个新的 div 是在 html 中输出这两个之后创建。我不确定我是否必须进行计数或 w/a,但看起来不像是整洁的编码...
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>";
}
}
您可以将 glob 用作 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
我有一个滑块,我可以在其中同时显示两个垂直图像 (image reference),并且我正在使用 slick slide 来使用滑块 - 它工作正常,但我现在正在尝试编写一些可以让我使用的代码只需在数据库中指定从哪个文件夹中选择图像,然后将每两个图像分类到适当的模板中。
我首先想到了 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 这样在我的循环中我将回显数组中的两个图像,而不是将它们全部放在一个单独的 "line" 可以这么说..所以一个新的 div 是在 html 中输出这两个之后创建。我不确定我是否必须进行计数或 w/a,但看起来不像是整洁的编码...
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>";
}
}
您可以将 glob 用作 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