This is a discussion on Best way to sort arrays within the PHP Language forums, part of the PHP Programming Forums category; Hi, On my page I oftend find myself presenting my data like this - all entries 1 - first (last modified) 2 - ...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
Hi,
On my page I oftend find myself presenting my data like this - all entries 1 - first (last modified) 2 - second 3 - last - last entries 3 - last - last modified 1 - first (last modified) I have found a couple of ways to solve this The first is 3 different queries $allentries=$db::select('SELECT * FROM entries') $lastentries=$db::select('SELECT * FROM entries ORDER BY id DESC LIMIT 5') $lastmodefiedentries=$db::select('SELECT * FROM entries ORDER BY modefied DESC limit 5') $allentries=$db::select('SELECT * FROM entries') foreach($allentries as $val) { // $lastentries[$val['id']]=$val; $lastmodefiedentries[$val['modefied']] } // sort by id krsort($lastentries) // sort by modefied krsort($lastmodefiedentries) // etc But I cant help wondering there should be a more efficient way to solve this. In the first solution I use 2 extra queries and in the last soution I use more system resources and it isn't really reusable. Anyone know a better way ? Floortje |
|
|||
|
On Oct 31, 2:38 pm, floortje <n...@none.none> wrote:
> Hi, > > On my page I oftend find myself presenting my data like this > > - all entries > 1 - first (last modified) > 2 - second > 3 - last > > - last entries > 3 - last > > - last modified > 1 - first (last modified) > > I have found a couple of ways to solve this > > The first is 3 different queries > $allentries=$db::select('SELECT * FROM entries') > $lastentries=$db::select('SELECT * FROM entries ORDER BY id DESC LIMIT 5') > $lastmodefiedentries=$db::select('SELECT * FROM entries ORDER BY > modefied DESC limit 5') > > $allentries=$db::select('SELECT * FROM entries') > foreach($allentries as $val) > { > // > $lastentries[$val['id']]=$val; > $lastmodefiedentries[$val['modefied']]} > > // sort by id > krsort($lastentries) > > // sort by modefied > krsort($lastmodefiedentries) > > // etc > > But I cant help wondering there should be a more efficient way to solve this. > > In the first solution I use 2 extra queries and in the last soution I > use more system resources and it isn't really reusable. > > Anyone know a better way ? > > Floortje Could you not cut out the first query? Just in your second query lose the 'limit' clause and then when you print "all entries", use the $lastentries result. If ordered backwards, start from the last key and iterate backwards, I suppose. And then when you print part 2, just take the first 5. Other than that, I would go with the 3 queries. Is there a need for it to be much faster? |
|
|||
|
>
> Could you not cut out the first query? Just in your second query lose > the 'limit' clause and then when you print "all entries", use the > $lastentries result. If ordered backwards, start from the last key and > iterate backwards, I suppose. > > And then when you print part 2, just take the first 5. > > Other than that, I would go with the 3 queries. Is there a need for it > to be much faster? I agree .... there are ways to work around the problem. I could do something like: echo 'Last 5 entries'; for ($i=count($allentries),$i>(count($allentries)-5);$i--) { echo $allentries[--$i].'<br />'; } But It still bothers me that I cant simply extract 5 rows that have largest/smallest value in an array field from a multi dimentional array. Is there really no better way to do this ? Floortje |
|
|||
|
..oO(floortje)
>I agree .... there are ways to work around the problem. > >I could do something like: > >echo 'Last 5 entries'; >for ($i=count($allentries),$i>(count($allentries)-5);$i--) >{ >echo $allentries[--$i].'<br />'; >} > >But It still bothers me that I cant simply extract 5 rows that have >largest/smallest value in an array field from a multi dimentional >array. Is there really no better way to do this ? For extracting a part of an array there is array_slice(), which should work for your latest entries. For getting the modified ones you could sort the array with a user-defined comparison function and then use array_slice() again. You could also try array_filter(). The callback function just has to check if the entry was modified. Micha |