My brain is not functioning! I am trying to select a number of random images (lets say 3) from a selection of folders within one other folder and I am either over complicating the code or am missing something as I can't quite get it to work.

What I have so far is

$imgDirectory = 'images/portfolio/';
$results = scandir($imgDirectory);
$images = array();
foreach ($results as $result) {
    if ($result != '.' && $result != '..') {
        $imgDir = 'images/portfolio/'.$result.'/';
        $images[] = glob($imgDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
$randomImages = array_rand($images, 3);

foreach ($randomImages as $value) {
    echo $value.'<br>'; // this is just set up for testing at the moment

My code is getting all of the sub-folders as expected and then is also getting all the images in each folder. However when I try to echo those images, all I am getting is the array index number. If I dump the array, I get

Array ( 
    [0] => Array ( ) 
    [1] => Array ( 
        [0] => images/portfolio/kitchens/0_64446400_1339145292.jpg 
        [1] => images/portfolio/kitchens/0_98163100_1339145225.jpg
    [2] => Array ( 
        [0] => images/portfolio/patios/0_08724600_1339141112.jpg 
        [1] => images/portfolio/patios/0_16298600_1339141074.jpg 
    [3] => Array ( 
        [0] => images/portfolio/stonework/0_13904600_1339140361.jpg 
        [1] => images/portfolio/stonework/0_25698100_1339141591.jpg 
    [4] => Array ( 
        [0] => images/portfolio/stoves-fireplaces/wood-burning-stove.jpg 
        [1] => images/portfolio/stoves-fireplaces/empty-fireplace.jpg 

There are more images but I didn't think you needed to see the full list. As you can see I have a multi-dimensional array with a random empty array at index 0 and I cannot access the image files in the sub-array. What am I missing??

5 Years
Discussion Span
Last Post by simplypixie

On line 7, you want to merge the arrays, not add one as an item to the other. This assumes that the array keys are numeric.

$images = array_merge($images + glob($imgDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE));

Thank you, that makes sense and I have implemented the code which is now working better, in that I have an array as I expect it to be.

The problem now arising is that I am only getting 10 array items printed out when I should have 24.
The current code

$imgDirectory = 'images/portfolio/';
$folders = scandir($imgDirectory);
$images = array();
foreach ($folders as $folder) {
    if ($folder != '.' && $folder != '..') {
        $imgDir = 'images/portfolio/'.$folder.'/';
        $images = array_merge($images + glob($imgDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE));

Gives me

Array ( 
    [0] => images/portfolio/fireplaces/empty-fireplace.jpg 
    [1] => images/portfolio/fireplaces/fireplace-work-in-progress-1.jpg 
    [2] => images/portfolio/fireplaces/fireplace-work-in-progress-2.jpg 
    [3] => images/portfolio/fireplaces/fireplace-work-in-progress-3.jpg 
    [4] => images/portfolio/fireplaces/stove-installation-2.jpg 
    [5] => images/portfolio/fireplaces/wood-burning-stove.jpg 
    [6] => images/portfolio/fireplaces/stove-installation.png 
    [7] => images/portfolio/fireplaces/stoves-main-image.png 
    [8] => images/portfolio/stonework/0_82615200_1339141214.jpg 
    [9] => images/portfolio/stonework/house-stonework.jpg 

As you can see there are only 2 image folders being added to the array when there should be 4 (if I echo out the $folder in the foreach I get all 4 folders) and also in the images/portfolio/stonework folder there are actually 10 images in the folder but only 2 have been added to the array.

I can see no reason why the number of array items is 'limited' and why the other 2 folders aren't being added to the array.

Any ideas?


Sorry, it should have been a comma to separate the arguments in array_merge not a plus.

It'll be limited because adding two arrays with a + overwrites duplicate indexes. array_merge doesn't overwrite duplicate numeric keys.

Edited by blocblue


You can tell I don't work with arrays very much (well not like this anyway) :) That's got it sorted, thank you again.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.