我在PHP中使用glob函数来浏览目录并尝试仅匹配图像文件.这是有效的,但是当我尝试计算每个目录中的图像时,它会重复其他目录的第一个目录的计数.例如,目录1有6个图像,目录2有4个图像但是当我尝试显示每个目录的计数时,它显示目录2的6个图像,依此类推.
这是我的代码:
public function viewphotoalbumsAction()
{
$identity = $this->identity();
$dirname = array();
$files = array();
foreach (glob(getcwd() . '/public/images/profile/' . $identity . '/albums/*', GLOB_ONLYDIR) as $dir) {
$dirname[] = basename($dir);
foreach (glob($dir . '/*.{jpg,png,gif}', GLOB_BRACE) as $images) {
$files[] = $images;
}
}
//var_dump($files); exit;
$data = array(
'albums' => array_values($dirname),
'files' => $files,
);
return new ViewModel(array('album' => $data['albums'], 'files' => $data['files']));
}
Run Code Online (Sandbox Code Playgroud)
var_dump()的结果
array(9) { [0]=> string(96) "C:\xampp\htdocs/public/images/profile/fooboy/albums/bone mom's album_2017-07-03/massive snow.jpg"
[1]=> string(91) "C:\xampp\htdocs/public/images/profile/fooboy/albums/bone mom's album_2017-07-03/mom-jon.jpg"
[2]=> string(90) "C:\xampp\htdocs/public/images/profile/fooboy/albums/bone mom's album_2017-07-03/sunset.jpg"
[3]=> string(85) "C:\xampp\htdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/cref.jpg"
[4]=> string(88) "C:\xampp\htdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/diploma.jpg"
[5]=> string(86) "C:\xampp\htdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/eeyor.jpg"
[6]=> string(93) "C:\xampp\htdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/frother-jaws.jpg"
[7]=> string(88) "C:\xampp\htdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/frother.jpg"
[8]=> string(93) "C:\xampp\htdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/goat_singing.jpg" }
Run Code Online (Sandbox Code Playgroud)
它正如预期的那样从每个目录中获取所有图像,但我真正需要做的是分离图像,这样我就可以为每个目录准确计数,而不仅仅是显示整个计数(9)
视图代码:
<div class="w3-col m7">
<div class="w3-row-padding">
<div class="w3-col m12">
<div class="w3-card-2 w3-round w3-white">
<div class="w3-container w3-padding" id="view-photo-albums">
<p class="w3-center">Current Albums</p>
<br>
<?php
foreach ($this->album as $albums):
?>
<p>
<?php echo $albums; ?> - Number of images: <?php echo $this->files; ?>
</p>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
更新:
我不能使用array_values了$data['files'],像我一样的$data['albums'],因为它是给数组的字符串转换警告.
这段代码中存在一个问题:
foreach (glob($dir . '/*.{jpg,png,gif}', GLOB_BRACE) as $images) {
$files[] = $images;
}
Run Code Online (Sandbox Code Playgroud)
该变量$dir用于迭代第一次调用返回的数组glob():
foreach (glob(...) as $dir) {
...
}
Run Code Online (Sandbox Code Playgroud)
第一个foreach循环结束后的值是分配给循环的最后一个值foreach.
最后,$data['albums']包含所有目录名称,并$data['files']包含上面列出的最后一个目录中的文件名$data['albums'].
我不能像$ data ['albums']那样使用$ data ['files']的array_values,因为它会给出数组到字符串转换的警告.
array_values()不会产生任何新的$dirname和$files.如果它们被创建(!),则这两个变量包含以序列号开头的值0; 这正是array_values()回归.
您发布的代码的意图对我来说不是很清楚.我假设您要显示相册列表以及每张相册包含多少张图片.
我就是这样做的:
public function viewphotoalbumsAction()
{
$identity = $this->identity();
// Always initialize the arrays before putting values into them.
// Without this, if the first glob() returns an empty array, the outer
// foreach loop never runs and both $dirname and $files end up being undefined
// and this produces trouble in the code that uses these variables later.
$dirname = array();
// This will be a two dimensional array. It is indexed by directory
// names and contains the lists of files for each directory.
$files = array();
// The outer loop enumerates the albums
foreach (glob(getcwd() . '/public/images/profile/' . $identity . '/albums/*', GLOB_ONLYDIR) as $dir) {
// The directory name is the album name
$albumName = basename($dir);
// Put the album name in $dirname[]
// This is not really needed as we also have the album name
// as key in $files but can be useful if you want to keep more
// information about each album
$dirname[] = $albumName;
// Initialize the list of images of this album
$files[$albumName] = array();
// The inner loop enumerates the images of this directory
foreach (glob($dir . '/*.{jpg,png,gif}', GLOB_BRACE) as $images) {
$files[] = $images;
}
}
// Prepare the data for display
$data = array(
'albums' => $dirname,
'files' => $files,
);
return new ViewModel($data);
}
Run Code Online (Sandbox Code Playgroud)
视图(忽略HTML包装器,它没关系):
<?php foreach ($this->files as $albumName => $listFiles): ?>
<p>
<?php echo $albumName; ?> - Number of images: <?php echo count($listFiles); ?>
</p>
<?php endforeach; ?>
Run Code Online (Sandbox Code Playgroud)
作为评论,foreach甚至不需要内部循环,因为它所做的只是将返回的数组中的值逐个复制glob()到新数组中.
这是更快,更容易阅读和理解,只是存储返回的值glob()成$files[$albumName].由于$dirname永远不会使用存储的值,因此可以完全省略此变量,并且函数会变短(注释省略):
public function viewphotoalbumsAction()
{
$identity = $this->identity();
$files = array();
foreach (glob(getcwd().'/public/images/profile/'.$identity.'/albums/*', GLOB_ONLYDIR) as $dir) {
$albumName = basename($dir);
$files[$albumName] = glob($dir . '/*.{jpg,png,gif}', GLOB_BRACE);
}
return new ViewModel(array('files' => $files));
}
Run Code Online (Sandbox Code Playgroud)