php – 重复两个目录的图像计数

前端之家收集整理的这篇文章主要介绍了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:\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" }

它正在按预期获取每个目录中的所有图像,但我真正需要做的是分离图像,这样我就可以为每个目录准确计数,而不仅仅是显示整个计数(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>

任何帮助,将不胜感激.

更新:
我不能像$data [‘albums’]那样使用$data [‘files’]的array_values,因为它会给出数组到字符串转换的警告.

这段代码中存在一个问题:
foreach (glob($dir . '/*.{jpg,GLOB_BRACE) as $images) {
     $files[] = $images;
}

变量$dir用于迭代第一次调用glob()返回的数组:

foreach (glob(...) as $dir) {
    ...
}

第一个foreach循环结束后的值是分配给foreach循环的最后一个值.

最后,$data [‘albums’]包含所有目录名称,$data [‘files’]包含$data [‘albums’]中列出的最后一个目录中的文件名.

I cannot use array_values for $data[‘files’] as I did for $data[‘albums’] as it is giving a warning of array to string conversion.

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,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));
}
原文链接:https://www.f2er.com/php/135810.html

猜你在找的PHP相关文章