Re: uasort strange problem [message #173458 is a reply to message #173430] |
Wed, 13 April 2011 18:32 |
Peter
Messages: 15 Registered: March 2003
Karma:
|
Junior Member |
|
|
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.
> P.S. In general, it's better to let the database do the sorting. Maybe
> you would like to follow up on that end in comp.databases.mysql.
>
>
Like I said, it's not really an option. The results are originally
ordered by relevancy based upon looking in the product name and...
Any records that have the complete matching string in them, then
Any records where the string contains all words but not in any order,
then
Any record that contains any of the words used in the search string
After that I then have to search on more detailed product information
using the same criteria
I have steered well clear of even attempting any SQL query to allow me
to perform such a search that would allow me to return the records in
the correct order, so I have to copy all queries to any array and then
remove any duplicates.
If you believe this may be possible then I'll certainly ask this in
comp.databases.mysql.
--
Pete Ives
Remove All_stRESS before sending me an email
|
|
|