这是我的代码:
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)); }