Go Back   CodingForums.com > :: Server side development > PHP

Before you post, read our: Rules & Posting Guidelines

Reply
 
Thread Tools Rate Thread
Enjoy an ad free experience by logging in. Not a member yet? Register.
Old 12-08-2010, 04:32 PM   PM User | #1
teacher
New to the CF scene

 
Join Date: Dec 2010
Posts: 1
Thanks: 0
Thanked 0 Times in 0 Posts
teacher is an unknown quantity at this point
Selecting and using only a section of results from an array

Hi there, I am currently pulling my hair out, as I have been trying to get my code working for the past 5 days and am getting nowhere fast. I have tried virtually every permutation of possibilities that I can think of, or have been advised of, and it's still not working.

Anyway, I was wondering if anyone here would have any insight into what I have done wrong. I am a PHP noob, so if you could actually explain to me any suggestions in the simplest way possible, it'll help me learn from my mistakes!

What I am trying to do is make a gallery.

I have several folders of pics in one main folder called 'gallery'.

I want the page to look inside the 'gallery' folder, see how many folders are in it, then use a pic called 'thumb.jpg' that is in each folder to display a thumb on the main gallery page in reverse order, so that the latest gallery is at the top.

I am numbering my galleries 001,002,003,004... etc in order to make the sorting easy.

So far so good... I can get it to do all this, however then comes the issue of pagination. I am aware that this is a minefield, and it's one I really don't think I can get my head around right now, so rather than confusing myself more with even more functions and code, all I want to do is write a second page that is exactly the same as the first page, apart from it will display the galleries from where the last page finished.

For example... I currently have 16 test folders in my main gallery folder (001,002, etc to....016).
I want the first 6 to display on the main page, then the next 6 to display on page 2, which I will hardlink to at the bottom of the main page.

I don't envisage there being more than the 2 pages just now, but if there are in the future, I can always just make a new page and hardlink it in the same way. I will look into pagination for more pages once it becomes necessary and I've got my head around this first!!!

Anyway... here's the code so far :

PHP Code:
$images "gallery/"# Location of galleries
$cols   2# Number of columns to display 
$start     6# First gallery to show on this page
$max     6# Maximum number of galleries to show

// the folder '$images' is opened, and each folder within it is counted. I am
// not 100% sure what is actually going on here, but I have copied this 
// snippet from another page I have that works in the same way.
// If someone has a brief layman's explanation, I'd be grateful!

if ($handle opendir($images)) { 
   while (
false !== ($file readdir($handle))) { 
       if (
$file != "." && $file != "..") { 
           
$files[] = $file
       } 
   } 
   
closedir($handle); 


$colCtr 0

// the table is started and the files are sorted. for some reason, 
// natcasesort() and natsort() both gave weird sort orders 
// and rsort() puts them in normal order, so I'm using sort()

echo "<div><table><tr>"

 
sort($files);

$c count($files) - ($start); 
// $c = counts the files in the array minus 1, in order to get the real value... 
// then $start is subtracted to carry on where the last page left off. 
// It doesn't though :(

for($i $c$i > ($c $max); $i--) 
// $i = $c, $i is greater than the array count minus $max, 
// $i de-increments on each loop.  This will give us a countdown for the 
// number of galleries required and no more on a page than the value 
// specified in $max.



  if(
$colCtr %$cols == 0
    echo 
"</tr><tr>"
  echo 
"<td><a href\"gallerylist.php?folder=" $files[$i] . "\"><img src=\"" $images $files[$i] . "/thumb.jpg\" width=\"240px\" height=\"180px\" alt=\"" $alt "\" /></a></td>"
// echo'ing out the $file[$i] on the loop, will give us the last required number 
// of files in the file array. there will be no more than $max on a page, but 
// how do I get it starting from gallery number $start???

  
$colCtr++; 


// close the table once the galleries have been displayed.
echo "</table></div>" "\r\n"
I have tried using array_slice(), but I don't think I am doing it correctly, as it's displaying 3 galleries and 3 spaces rather than all 6 galleries...

I'm using sort() rather than rsort() as for some bloody reason it seems to be getting the files in reverse order to start with... not sure why

I have looked into range() but again, am not sure how to use it.

I have also tried ever permutation of having $start - or + in various parts of the code.

I have tried using sprintf() to make sure I'm not losing my leading '0's on the folder numbers...

I'm basically pulling my hair out now. Do you have a smiley for that?

Anyway... any help GREATLY appreciated.

Last edited by teacher; 12-08-2010 at 04:35 PM..
teacher is offline   Reply With Quote
Old 12-08-2010, 06:36 PM   PM User | #2
Fou-Lu
God Emperor


 
Fou-Lu's Avatar
 
Join Date: Sep 2002
Location: Saskatoon, Saskatchewan
Posts: 15,650
Thanks: 4
Thanked 2,451 Times in 2,420 Posts
Fou-Lu is a name known to allFou-Lu is a name known to allFou-Lu is a name known to allFou-Lu is a name known to allFou-Lu is a name known to allFou-Lu is a name known to all
The only real pagination issue here is that you still need to work linearly since you are scanning a directory. This isn't really a huge problem though since the collection is so small.
Lets start with your sort. The reason is a pain is simply because the numbers are considered strings. You may want to consider using a simple usort, this will probably work:
PHP Code:
function sortRevNums($a$b)
{
    return 
strcmp($a$b);
}

usort($files'sortRevNums'); 
Breaking the array up itself makes the most sense, this is what you will want to do. Since we now have a sorted $files array, try this:
PHP Code:
$sliced array_slice($files$start$max); 
To actually pagination, $start would be a comparison between a provided page number and $max:
PHP Code:
$start = isset($_GET['page']) ? (int)$_GET['page'] : 0;
$startAt *= $max;
if (
$startAt 0)
{
    
$startAt += 1;

So lets see, if $max is 3, and $start is 0, then $startAt = 0. If $max is 3 and $start is 2, $startAt = 6 + 1 since the first 6 went with the $start 0 and $start 1.
Yeah that looks about right there.

Edit:
Oh yeah, then you iterated the $sliced array instead:
PHP Code:
$iItems count($sliced);
for (
$i 0$i $iItems; ++$i)
{
    ....

Or you can use a while or foreach or whatever you like for your loops.
__________________
As of PHP 5.5, the MySQL library has been officially deprecated. It is recommended to move to either MySQLi or PDO libraries for your mysql connectivity. See here for help choosing which interface you prefer: http://php.net/manual/en/mysqlinfo.api.choosing.php
Fou-Lu is offline   Reply With Quote
Reply

Bookmarks

Jump To Top of Thread


Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 06:45 AM.


Advertisement
Log in to turn off these ads.