Best way to sort arrays

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