php – 重复两个目录的图像计数
|
我在
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']));
}
var_dump()的结果 array(9) { [0]=> string(96) "C:xampphtdocs/public/images/profile/fooboy/albums/bone mom's album_2017-07-03/massive snow.jpg"
[1]=> string(91) "C:xampphtdocs/public/images/profile/fooboy/albums/bone mom's album_2017-07-03/mom-jon.jpg"
[2]=> string(90) "C:xampphtdocs/public/images/profile/fooboy/albums/bone mom's album_2017-07-03/sunset.jpg"
[3]=> string(85) "C:xampphtdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/cref.jpg"
[4]=> string(88) "C:xampphtdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/diploma.jpg"
[5]=> string(86) "C:xampphtdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/eeyor.jpg"
[6]=> string(93) "C:xampphtdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/frother-jaws.jpg"
[7]=> string(88) "C:xampphtdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/frother.jpg"
[8]=> string(93) "C:xampphtdocs/public/images/profile/fooboy/albums/random photos_2017-07-02/goat_singing.jpg" }
它正在按预期获取每个目录中的所有图像,但我真正需要做的是分离图像,这样我就可以为每个目录准确计数,而不仅仅是显示整个计数(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>
任何帮助,将不胜感激. 更新:
这段代码中存在一个问题:
foreach (glob($dir . '/*.{jpg,GLOB_BRACE) as $images) {
$files[] = $images;
}
变量$dir用于迭代第一次调用glob()返回的数组: foreach (glob(...) as $dir) {
...
}
第一个foreach循环结束后的值是分配给foreach循环的最后一个值. 最后,$data [‘albums’]包含所有目录名称,$data [‘files’]包含$data [‘albums’]中列出的最后一个目录中的文件名.
您发布的代码的意图对我来说不是很清楚.我假设您要显示相册列表以及每张相册包含多少张图片. 我就是这样做的: 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,GLOB_BRACE) as $images) {
$files[] = $images;
}
}
// Prepare the data for display
$data = array(
'albums' => $dirname,);
return new ViewModel($data);
}
视图(忽略了HTML包装器,它没关系): <?php foreach ($this->files as $albumName => $listFiles): ?>
<p>
<?php echo $albumName; ?> - Number of images: <?php echo count($listFiles); ?>
</p>
<?php endforeach; ?>
作为评论,内部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,GLOB_BRACE);
}
return new ViewModel(array('files' => $files));
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
