重复两个目录的图像计数

use*_*411 7 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']));
}
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'],因为它是给数组的字符串转换警告.

axi*_*iac 5

这段代码中存在一个问题:

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)