Jump to content

Sorting Multidimentional Array by two Indexes


xProteuSx

Recommended Posts

I've got a few arrays as follows:

 

$array1 = ('A', 54, 'a', 2);
$array2 = (, 67, 'b',);
$array3 = ('R', 54,,);
$array4 = (, 36, 'b');
$array5 = (, 36, 'a',);
$array6 = ('FX', 119, 's', 4);
$array7 = ('R', 3, 'c',);

$superarray = array($array1, $array2, $array3, $array4, $array5, $array6, $array7);

 

Now, I've got a piece of code that sorts $superarray by index[1] of the sub-arrays.  The code looks like this:

 

function sortmulti ($array, $index, $order, $natsort=FALSE, $case_sensitive=FALSE)
               {
              if(is_array($array) && count($array)>0)
                   {
                  foreach(array_keys($array) as $key)
                     $temp[$key]=$array[$key][$index];
                  if(!$natsort)
                       {
                      if ($order=='asc')
                          asort($temp);
                      else   
                          arsort($temp);
                     }   
                  else
                     {
                      if ($case_sensitive===true)
                          natsort($temp);
                      else
                          natcasesort($temp);
                     if($order!='asc')
                         $temp=array_reverse($temp,TRUE);
                     }
                  foreach(array_keys($temp) as $key)
                      if (is_numeric($key))
                          $sorted[]=$array[$key];
                      else   
                          $sorted[$key]=$array[$key];
                  return $sorted;
                 }
             return $sorted;
            }

$sortedarray = sortmulti($superarray, 1, ASC, $natsort=FALSE, $case_sensitive=FALSE)

 

The output is this:

 

R3c

36b

36a

A54a2

R54

67b

FX119s4

 

This is great because it goes 3 -> 36 -> 36 -> 54 -> 54 -> 67 -> 119.

 

However, the problem, if you look, is this part:

 

36b

36a

 

Its sorted everything according to index[1] of the sub-arrays, but now I would like to sort by index[2], then index[3] as well.  I'd like the output to look like this:

 

R3c

36a

36b

A54a2

R54

67b

FX119s4

 

Any ideas?  Because this is way over my head ...

In general, you would use array_multisort -

 

<?php
// Obtain lists of column values to sort by
foreach ($superarray as $key => $row) {
    $index1[$key] = $row[1];
    $index2[$key] = $row[2];
$index3[$key] = $row[3];
}

// Sort the data with index1 asc, index2 asc, index3 asc
array_multisort($index1, SORT_ASC, $index2, SORT_ASC, $index3, SORT_ASC, $superarray);

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.