Re: uasort strange problem [message #173465 is a reply to message #173458] |
Wed, 13 April 2011 20:53 |
Denis McMahon
Messages: 634 Registered: September 2010
Karma:
|
Senior Member |
|
|
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.
Rgds
Denis McMahon
|
|
|