Best way to sort arrays
am 31.10.2007 20:38:04 von patrick finger
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
Re: Best way to sort arrays
am 01.11.2007 02:22:01 von douggunnoe
On Oct 31, 2:38 pm, floortje 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?
Re: Best way to sort arrays
am 01.11.2007 10:38:04 von patrick finger
>
> 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].'
';
}
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
Re: Best way to sort arrays
am 01.11.2007 19:10:05 von Michael Fesser
..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].'
';
>}
>
>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