NYCPHP Meetup

NYPHP.org

[nycphp-talk] Sorting 2-dimensional arrays at 2:00 am - UGH!

Phil Powell soazine at erols.com
Mon Aug 11 12:46:24 EDT 2003


Oh yeah I got it BTW, at 4:00am

And rethinking my data structures is never an option; I'll just make it even
more complicated by doing so!  In fact, PHP is the saving grace behind the
idea of sorting data that is parsed from an XML file into a TCL
1-dimensional list.  Otherwise, it would never be done at all.

I have this data that consists of feedback information, when users enter
feedback from my site.  The feedback XML row will consist of:

firstname
lastname
email
url
categoryID (feedback category ID maps to feedbackCategories.xml which has
like 1 => "trivia" or 2 => "articles"...)
timeStamp
showEntry (a boolean switch to "delete" this entry upon choice)

I use TCL to parse the XML file (long story, trust me) and it converts it to
a 1-dimensional list.  However, I would need to sort this one-dimensional
list as follows:

1) sort first by ascending category_id
2) sort each separated category_id by descending timestamp order

So, long in short, this is what I came up with:

// FUNCTION TO BE USED IN uksort() TO RETURN A REVERSE-CASE-INSENSITIVE
BOOLEAN FOR REVERSE SORTING
  function strrevcasecmp($a, $b) {
   if (strcasecmp($a, $b) == 0) return 0;
   return (strcasecmp($a, $b) > 0) ? -1 : 1;
  }

...// reparse the original feedback.xml file instead of using the TCL list
(the TCL script will have updated the existing XML file if need be prior to
calling this PHP script)

// SORT THE OUTER ARRAY FIRST IN CATEGORY_ID ASC AND THEN EACH INNER ARRAY
BY TIME DESC
   // BE SURE TO SUPPRESS WARNINGS IF NO DATA IS FOUND IN fbArray
   @ksort($fbArray);
   if (sizeof($fbArray) > 0) {
    foreach ($fbArray as $key => $val) {
     @uksort($val, "strrevcasecmp");
     $fbArray[$key] = $val;
    }
   }

And there you have it, an overcomplicated solution, once again, possibly an
extremely simpler solution out there that I simply can't fathom. :(

Phil
----- Original Message -----
From: "Hans Zaunere" <hans at nyphp.org>
To: "NYPHP Talk" <talk at lists.nyphp.org>
Sent: Monday, August 11, 2003 12:42 PM
Subject: Re: [nycphp-talk] Sorting 2-dimensional arrays at 2:00 am - UGH!


>
>
> Phil Powell wrote:
>
> > $fbArray[$j] = array($feedbackCategoryArray[$i]['attributes']['NAME'] =>
> > $feedbackCategoryArray[$i]['attributes']['DISPLAYNAME']);
> >
> > I can't begin to fathom in my befuddled mind how to sort this array
> > $fbArray into alphabetical order according to
> > $feedbackCategoryArray[$i]['attributes']['NAME']
>
> I'll throw this function out there as an example:
>
>    function __sortOn( $metadata,$sort_flags,$reverse = FALSE ) {
>
>       if( !isset($this->Listing[0][$metadata]) )
>          return FALSE;
>
>       $metakeys = array();
>       foreach( $this->Listing as $key => $sorton )
>          $metakeys[$key] = $sorton[$metadata];
>
>       if( $reverse )
>          arsort($metakeys,$sort_flags);
>       else
>          asort($metakeys,$sort_flags);
>
>       $tmp = array();
>       foreach( $metakeys as $key => $metakey )
>          $tmp[] = $this->Listing[$key];
>
>       $this->Listing = $tmp;
>
>       return TRUE;
>    }
>
> > - I am utterly lost,
> > can someone explain in detail how I would do it and why.
>
> I have no idea why, but I'd consider rethinking your data structures a bit
:)
>
> H
>
>
> _______________________________________________
> talk mailing list
> talk at lists.nyphp.org
> http://lists.nyphp.org/mailman/listinfo/talk




More information about the talk mailing list