FUDforum
Fast Uncompromising Discussions. FUDforum will get your users talking.

Home » Imported messages » comp.lang.php » uasort strange problem
Show: Today's Messages :: Polls :: Message Navigator
Return to the default flat view Create a new topic Submit Reply
Re: uasort strange problem [message #173467 is a reply to message #173465] Wed, 13 April 2011 22:34 Go to previous messageGo to previous message
Peter is currently offline  Peter
Messages: 15
Registered: March 2003
Karma:
Junior Member
In article <4da60d5c$0$12063$bed64819(at)gradwell(dot)net>,
denis(dot)m(dot)f(dot)mcmahon(at)gmail(dot)com says...
> On Wed, 13 Apr 2011 19:32:15 +0100, Peter wrote:
>
>> In article <io2u9e$mi3$1(at)dont-email(dot)me>, jstucklex(at)attglobal(dot)net says...
>>> On 4/12/2011 6:38 PM, Peter wrote:
>>>> Hi all,
>>>>
>>>> I currently have a list of products stored in a multi-dimensional
>>>> array which contains, amongst other fields, the product's name,
>>>> heading 'name', and the product's price, heading 'price' and I want
>>>> to be able to sort the array by name ascending/descending and price
>>>> ascending/descending.
>>>>
>>>> The array is originally created from a mysql database using various
>>>> tables and so I have not been able to create a simple, mysql query
>>>> that allows me to return the data already sorted. There are various
>>>> reasons for this which I don't wish to go into here, being a php
>>>> forum.
>>>>
>>>> So I found out about the uasort function, plus a small routine that
>>>> seemed to be just what I was looking for to allow me to sort on
>>>> either 'name' or 'price' ascending. I then discovered the
>>>> array_reverse function which I thought would allow me to reverse the
>>>> array to allow me to have 'name' or 'price' descending options.
>>>>
>>>> At least that's what I thought, but I'm new to both functions and so
>>>> I might be missing something obvious and so hope that someone here
>>>> can point out my mistakes.
>>>>
>>>> Here's the problem. If I just compare on either 'name' or 'price'
>>>> ascending the array remains unsorted. If I compare on either 'name'
>>>> or 'price' ascending and then use the array_reverse function it works
>>>> like a charm and the array is perfectly sorted in descending order.
>>>> So what I'm not getting is this, how can an array that remains
>>>> unsorted when using either of my compare functions, suddenly become
>>>> sorted when reversed?
>>>>
>>>> Hope someone here can explain.
>>>>
>>>> Here is the php that I am using to sort the array:
>>>>
>>>> switch($searchtype){
>>>> case '1':
>>>> uasort($array, 'compare_nameAsc'); // sort on name ascending
> break;
>>>>
>>>> case '2':
>>>> uasort($array, 'compare_nameAsc'); // sort on name ascending
> $array
>>>> = array_reverse($array); // reverse the sort order break;
>>>>
>>>> case '3':
>>>> uasort($array, 'compare_priceAsc'); // sort on price ascending
>>>> break;
>>>>
>>>> case '4':
>>>> uasort($array3, 'compare_priceAsc'); // sort on price ascending
>>>> $array = array_reverse($array); // reverse the sort order break;
>>>> }
>>>>
>>>> And here are the 2 functions:
>>>>
>>>> function compare_nameAsc($a, $b)
>>>> {
>>>> return strnatcmp($a['name'], $b['name']);
>>>> }
>>>> function compare_priceAsc($a, $b)
>>>> {
>>>> return strnatcmp($a['price'], $b['price']);
>>>> }
>>>
>>> How are you displaying the items? uasort() maintains the key/value
>>> association, but array_reverse() does not by default.
>
>> The items are products that are returned when the user searches the
>> database using whichever keywords they enter.
>
> You didn't answer what Jerry asked.
>
> For example, are you using:
>
> foreach ($array as $value) {
> do_something_with ($value);
> }
>
> or:
>
> for ($index = 0; $index < length($array); $index = $index + 1) {
> do_something_with ($array['$index']);
> }
>
> or some other method of looping through and showing the array contents
> when you determine whether the "sort" has worked or not?
>
> I think that the former will show the sorted result, but the latter will
> show the array according to the original key values.
>

Well I was using print_r($array) to view the array as text as well as
using a while loop to iterate through the array from $array[0] to $array
[N] where N is the total unduplicated matches found.

Anyway, thanks to Jerry for pointing me in the right direction as far as
uasort. It does maintain the key value associations, which I hadn't
noticed. Oops!! So $array[0] was moved sorted along with the rest of the
record data, which was not what I wanted. I needed $array[0] to hold the
freshly sorted lowest record, be that either first in a-z or lowest
price, etc.

So I tried usort() instead and now everything works just great.

--
Pete Ives
Remove All_stRESS before sending me an email
[Message index]
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: Joomla, Wordpress, Expression Web
Next Topic: How can I serialize zend_http_request object?
Goto Forum:
  

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ]

Current Time: Mon Nov 25 01:28:48 GMT 2024

Total time taken to generate the page: 0.05859 seconds