Re: Multi-Sort -- how to do this?

From: Date: Thu, 18 Jun 2009 02:31:18 +0000
Subject: Re: Multi-Sort -- how to do this?
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-294208@lists.php.net to get a copy of this message
tedd wrote:
Hi gang: Here's the problem. Let's say you have a collection of arrays, such as: $a = array(); $b = array(); $c = array(); $d = array(); And then you populate the arrays like so: while(...) { $a[] = ... $b[] = ... $c[] = ... $d[] = ... } Now, let's say you want to sort the $d array, but you also want the arrays $a, $b, and $c to be arranged in the same resultant order as $d. For example, please follow this: Before sort of $d: $a = [apple, banana, grape, orange] $b = [100, 2111, 198, 150] $c = [red, yellow, purple, orange] $d = [100, 300, 11, 50] After sort of $d: $a = [grape, orange, apple, banana] $b = [198, 150, 100, 2111] $c = [purple, orange, red, yellow] $d = [11, 50, 100, 300] Is there a slick way to do that?
Yes... <?php function tedd_sort( &$arrays ) {
    $master = null;
    $followers = array();
    $first = true;
    foreach( array_keys( $arrays ) as $key )
    {
        if( $first )
        {
            $first = false;
            $master = &$arrays[$key];
        }
        else
        {
            $followers[] = &$arrays[$key];
        }
    }
    asort( $master );
    foreach( array_keys( $master ) as $mkey )
    {
        foreach( array_keys( $followers ) as $fkey )
        {
            $value = &$followers[$fkey][$mkey];
            unset( $followers[$fkey][$mkey] );
            $followers[$fkey][$mkey] = &$value;
        }
    }
} $a = array( 'apple', 'banana', 'grape', 'orange' ); $b = array( 100, 2111, 198, 150 ); $c = array( 'red', 'yellow', 'purple', 'orange' ); $d = array( 100, 300, 11, 50 ); $arrays = array( &$d, &$a, &$b, &$c ); tedd_sort( $arrays ); print_r( $a ); print_r( $b ); print_r( $c ); print_r( $d ); ?> If func_get_args() or func_get_arg() had supported retrieving a reference to the argument, then we could have saved having to pass the arrays via a combined array. I chose to make $d the first array since in your example result set it is the one sorted and thus the rest follow as you would expect. Cheers, Rob. -- http://www.interjinn.com Application and Templating Framework for PHP

« previous php.general (#294208) next »