SaranacLake Posted November 30, 2019 Share Posted November 30, 2019 Is there a limit to how many items can be stored in an array? My code looks in a directory of photos and writes the file names into the one-dimensional array. I just switched from my test folder to my actual photo folder - about 600 photos - and when I ran my script with var_dump enabled, my array only goes up to 128 items (0-127). I sure hope arrays aren't that wimpy?! Each photo is about 1-2MB in size, but since I am only storing the file name, I would expect that I could easily store thousands of elements in this array. What is going on? Quote Link to comment Share on other sites More sharing options...
Barand Posted November 30, 2019 Share Posted November 30, 2019 32 minutes ago, SaranacLake said: my array only goes up to 128 items (0-127). Must be something you are doing. Post code for the benefit of the clairvoyantly challenged. 1 Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 35 minutes ago, Barand said: Must be something you are doing. Post code for the benefit of the clairvoyantly challenged. Here is my code... <?php $path = "../WORKSPACE/images/"; $files = array(); // Check for Directory. if (is_dir($path)){ // Open Directory-Handle. $handle = opendir($path); if($handle){ // Iterate through Directory items. // Return name of next item in Directory (i.e. File or Folder). while(($file = readdir($handle)) !== FALSE){ if($file != '.' && $file != '..' && preg_match("#^[^\.].*$#", $file)){ // Not Directory, Not Hidden File // Add to array. $files[] = $file; // Simple array. // $files[] = array($file); // Nested array. } } closedir($handle); } } var_dump($files); exit(); ?> By the way, thanks for trying to help last night, but I couldn't really follow your glob( ) example so I took the above approach which was easier for me. Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 Why does formatting get messed up with PHPFreaks [ code ] tags? (Was never an issue in the past...) Quote Link to comment Share on other sites More sharing options...
Barand Posted November 30, 2019 Share Posted November 30, 2019 1 minute ago, SaranacLake said: Why does formatting get messed up with PHPFreaks [ code ] tags? Use spaces, not tabs. If your IDE has the option to convert tabs to spaces, use it. Quote Link to comment Share on other sites More sharing options...
requinix Posted November 30, 2019 Share Posted November 30, 2019 There is no limit on arrays. Your problem is elsewhere. Quote Link to comment Share on other sites More sharing options...
Barand Posted November 30, 2019 Share Posted November 30, 2019 Running your readdir() code on one of my folders, with 528 files, loads all of them into the array. Last bit of my var_dump... [524]=> string(9) "xmlns.php" [525]=> string(15) "xmltestdata.xml" [526]=> string(11) "YMDdiff.php" [527]=> string(10) "zodiac.txt" } Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 4 minutes ago, Barand said: Running your readdir() code on one of my folders, with 528 files, loads all of them into the array. Last bit of my var_dump... [524]=> string(9) "xmlns.php" [525]=> string(15) "xmltestdata.xml" [526]=> string(11) "YMDdiff.php" [527]=> string(10) "zodiac.txt" } So what could the issue be? Does it have to do anything with the filesize? I have like 600 1-2MB photos in the directory. Am using my Mac for dev work. Quote Link to comment Share on other sites More sharing options...
requinix Posted November 30, 2019 Share Posted November 30, 2019 7 minutes ago, SaranacLake said: Does it have to do anything with the filesize? I don't see anything in your code that has to do with file sizes. 7 minutes ago, SaranacLake said: I have like 600 1-2MB photos in the directory. Are they all in the same directory? Using any subdirectories? Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 16 minutes ago, requinix said: I don't see anything in your code that has to do with file sizes. Are they all in the same directory? Using any subdirectories? I have one sub-directory in the directory I point too, but it doesn't have that many photos in it. The fact that my array went to 127 makes me thing it is something predicatable since that is 128 elements in the array. (2^7=128) I dunno.... Quote Link to comment Share on other sites More sharing options...
Barand Posted November 30, 2019 Share Posted November 30, 2019 (edited) I also can't understand why your array index values are limited to a single signed byte. I'd expect a maximum of at least 2 billion (memory permitting) Array ( [2147483647] => 1 ) or even this on a 64 bit system Array ( [9223372036854775807] => 1 ) Edited November 30, 2019 by Barand Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 15 minutes ago, Barand said: I also can't understand why your array index values are limited to a single signed byte. I'd expect a maximum of at least 2 billion (memory permitting) I think there are a couple of strange things going on here... - When I uncomment Var_dump() and exit(), I do see the array count is correct (e.g. 1,210) but the actual displayed array is stopping at 128 elements and then says "more elements..." at the bottom. - When I comment out var_dump() and exit() and run my web page, I see blanks for what appers to be 1,210 files, but I am only seeing photos for maybe 100 or so. (Maybe 128?) - I have movies from my phone intertwined with the JPG's. I can try deleting those out of my "images/" folder, but I suspect this is a browser or memory ssue since 1,210 X 1-2 MB is A LOT of memory usage!! - I need to learn how to make smaller thumbnails... Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 I just sorted my original photos/videos by type, and grabbed all of the photos (i.e. 600) and pasted them in my websites "images/" directory. When I re-ran things, it took a while, but it appears that all of the photos rendered on my web page. That is nearly 1 GB of photos!! I think my browser was choking on the extra video files and the sheer size of things? Of course if I create thumbnails that will make it much easier to load things! Still curious why var_dump( ) won't show more than 128 elements in the display even though it gives a proper count. All very interesting! Quote Link to comment Share on other sites More sharing options...
Barand Posted November 30, 2019 Share Posted November 30, 2019 If you want to show a gallery then, yes, you really want thumbnail size images to display. You can have an image that is originally 4000 pixels x 2500 pixels and shrink it in the html image tag by specifying width='200' height = '125' so it looks like a thumbnail but you are still transferring the multi MB file. You therefore need to run a job to create thumbnail versions of all your images. (The best time to create them is when the image is uploaded but too late for that now). Perhaps have an images folder with the original images and a thumbs folder to contain the thumbnail images, one for each original) When you create the thumb images, decide on the size of square into which they should fit (say 150 or 200 pixels). Then calculate the thumbsize so the longest dimension just fits that square (be it landscape or portrait) then calculate what the shorter dimension needs to be to maintain the same aspect ratio. Then you just copy/resize the image to the new file. Quote Link to comment Share on other sites More sharing options...
requinix Posted November 30, 2019 Share Posted November 30, 2019 Note to self: next time someone talks about var_dump output, ask them to post said output. Because that way it will be much easier to spot when... 54 minutes ago, SaranacLake said: - When I uncomment Var_dump() and exit(), I do see the array count is correct (e.g. 1,210) but the actual displayed array is stopping at 128 elements and then says "more elements..." at the bottom. 27 minutes ago, SaranacLake said: Still curious why var_dump( ) won't show more than 128 elements in the display even though it gives a proper count. You are using Xdebug. Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 15 minutes ago, Barand said: If you want to show a gallery then, yes, you really want thumbnail size images to display. You can have an image that is originally 4000 pixels x 2500 pixels and shrink it in the html image tag by specifying width='200' height = '125' so it looks like a thumbnail but you are still transferring the multi MB file. You therefore need to run a job to create thumbnail versions of all your images. (The best time to create them is when the image is uploaded but too late for that now). Perhaps have an images folder with the original images and a thumbs folder to contain the thumbnail images, one for each original) When you create the thumb images, decide on the size of square into which they should fit (say 150 or 200 pixels). Then calculate the thumbsize so the longest dimension just fits that square (be it landscape or portrait) then calculate what the shorter dimension needs to be to maintain the same aspect ratio. Then you just copy/resize the image to the new file. Yeah, that is on to-do list putting this site together! Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 7 minutes ago, requinix said: Note to self: next time someone talks about var_dump output, ask them to post said output. Because that way it will be much easier to spot when... You are using Xdebug. Yeah, sorry, I didn't notice that the count was correct until trying several tests and then my eyes finally noticed that as I was searching for the issue. Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted November 30, 2019 Author Share Posted November 30, 2019 8 minutes ago, requinix said: Note to self: next time someone talks about var_dump output, ask them to post said output. Because that way it will be much easier to spot when... You are using Xdebug. Yes, I do happen to have Xdebug set up in NetBeans, but I haven't been using it for this particular issue.. Quote Link to comment Share on other sites More sharing options...
requinix Posted November 30, 2019 Share Posted November 30, 2019 7 minutes ago, SaranacLake said: Yes, I do happen to have Xdebug set up in NetBeans, but I haven't been using it for this particular issue.. I didn't say you were debugging. I said you're using Xdebug. Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted December 1, 2019 Author Share Posted December 1, 2019 19 minutes ago, requinix said: I didn't say you were debugging. I said you're using Xdebug. How did you know I use Xdebug? Quote Link to comment Share on other sites More sharing options...
requinix Posted December 1, 2019 Share Posted December 1, 2019 5 minutes ago, SaranacLake said: How did you know I use Xdebug? Did you notice the link in my post? The one that goes to a page whose very first sentence is "Xdebug replaces PHP's var_dump() function for displaying variables"? 1 Quote Link to comment Share on other sites More sharing options...
SaranacLake Posted December 1, 2019 Author Share Posted December 1, 2019 19 minutes ago, requinix said: Did you notice the link in my post? The one that goes to a page whose very first sentence is "Xdebug replaces PHP's var_dump() function for displaying variables"? Got it. My bad. Quote Link to comment Share on other sites More sharing options...
Barand Posted December 1, 2019 Share Posted December 1, 2019 12 hours ago, SaranacLake said: Yeah, that is on to-do list putting this site together! Christmas has come early! <?php const IMGDIR = 'images/'; const THUMBDIR = 'thumbs/'; const THUMBSIZE = 150; // max thumbnail dimension const NUM = 100; // number of images to be processed on each run $images = glob(IMGDIR.'{*.png,*.jpg}', GLOB_BRACE); $thumbs = glob(THUMBDIR.'{*.png,*.jpg}', GLOB_BRACE); // reduce to basenames only $images = array_map('basename', $images); $thumbs = array_map('basename', $thumbs); // copy the next NUM images to $todo list where thumbnails do not yet exist $todo = array_slice(array_diff($images, $thumbs), 0, NUM); $output = ''; foreach ($todo as $fn) { $sz = getimagesize(IMGDIR.$fn); if ($sz[0] == 0) continue; // not an image $ok = 0; $out = null; switch ($sz['mime']) { // check the mime types case 'image/jpeg': $im = imagecreatefromjpeg(IMGDIR.$fn); $ok = $im; $out = 'imagejpeg'; break; case 'image/png': $im = imagecreatefrompng(IMGDIR.$fn); $ok = $im; $out = 'imagepng'; break; default: $ok = 0; } if (!$ok) continue; // not png or jpg // calculate thumbnail dimensions if ($sz[0] >= $sz[1]) { // landscape $w = THUMBSIZE; $h = THUMBSIZE * $sz[1]/$sz[0]; } else { // portrait $h = THUMBSIZE; $w = THUMBSIZE * $sz[0]/$sz[1]; } // copy and resize the image $tim = imagecreatetruecolor(THUMBSIZE, THUMBSIZE); $bg = imagecolorallocatealpha($tim,0xFF,0xFF,0xFF,127); imagefill($tim, 0, 0, $bg); imagecolortransparent($tim, $bg); // centre the image in the 150 pixel square $dx = (THUMBSIZE - $w) / 2; $dy = (THUMBSIZE - $h) / 2; imagecopyresized($tim, $im, $dx, $dy, 0, 0, $w, $h, $sz[0], $sz[1]); imagesavealpha($tim, true); $out($tim, THUMBDIR.$fn); imagedestroy($im); imagedestroy($tim); $output .= "<img src='".THUMBDIR."$fn' alt='$fn'>\n"; } ?> <!DOCTYPE html> <html> <head> <meta http-equiv="content-language" content="en"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Create Thumbnails</title> <meta name="author" content="Barry Andrew"> <meta name="creation-date" content="10/09/2019"> <style type="text/css"> body { font-family: verdana, sans-serif; font-size: 11pt; } header { background-color: black; color: white; padding: 15px 10px;} img { margin: 5px; } </style> </head> <body> <header> <h1>New Thumbnail Images</h1> </header> <?=$output?> </body> </html> 2 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.