Re: [PHP] Multi-Sort -- how to do this?

[email protected] (Robert Cummings)
Newsgroups php.general
Organization InterJinn
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.