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 #173469 is a reply to message #173467] Thu, 14 April 2011 03:06 Go to previous messageGo to previous message
Jerry Stuckle is currently offline  Jerry Stuckle
Messages: 2598
Registered: September 2010
Karma:
Senior Member
On 4/13/2011 6:34 PM, Peter wrote:
> 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.
>

No, you don't. Just use foreach instead of a for loop. It will display
the array in the sorted order.

Remember - in PHP, ALL indeicies are associative - there is not an
integer key. So item[3] could easily precede item[0], item[1] and item[2].

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex(at)attglobal(dot)net
==================
[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: Thu Nov 28 14:13:04 GMT 2024

Total time taken to generate the page: 0.06155 seconds