Conner
Conner

Reputation: 677

How to sort an array of arrays by a key in PHP?

Array(
    ["car"] => Array(
                     [12/11/1989] => (...)
                     [6/14/2011] => (...)
                     [5/2/2012] => (...)
               )
    ["sled"] => Array(
                     [1/15/2001] => (...)
                     [4/14/2004] => (...)
                     [5/23/2005] => (...)
               )
    ["boat"] => Array(
                     [12/1/1999] => (...)
                     [6/14/2000] => (...)
                     [8/23/2000] => (...)
               )
)

Given the above array structure, I am trying to sort the keys ["boat"], ["sled"], ["car"] by the first date key in their respective sub-arrays. So the correct key order would now be car, boat, sled. Is there an elegant or easy way to do this with PHP?

Upvotes: 0

Views: 94

Answers (2)

leepowers
leepowers

Reputation: 38308

You'll need to use uasort and compare the first key value of each array. Cast to a timestring using strtotime to simplify date comparisons:

<?php

$array = array(
  "car" => array(
     "12/11/1989" => "first element",
     "6/14/2011" => "second element",
     "5/2/2012" => "third element",
  ),
  "sled" => array(
    "1/15/2001" => "first element",
    "4/14/2004" => "second element",
    "5/23/2005" => "third element",
  ),
  "boat" => array(
    "12/1/1999" => "first element",
    "6/14/2000" => "second element",
    "8/23/2000" => "third element",
  ),
);

uasort($array, function($a, $b) {
    $ts1 = strtotime(reset(array_keys($a)));
    $ts2 = strtotime(reset(array_keys($b)));
    if ($ts1 === $ts2) {
        return 0;
    }
    return ($ts1 < $ts2) ? -1 : 1;
});

var_export($array);

Which will output:

array (
  'car' => 
  array (
    '12/11/1989' => 'first element',
    '6/14/2011' => 'second element',
    '5/2/2012' => 'third element',
  ),
  'boat' => 
  array (
    '12/1/1999' => 'first element',
    '6/14/2000' => 'second element',
    '8/23/2000' => 'third element',
  ),
  'sled' => 
  array (
    '1/15/2001' => 'first element',
    '4/14/2004' => 'second element',
    '5/23/2005' => 'third element',
  ),
)

Upvotes: 0

Barmar
Barmar

Reputation: 780889

Use uasort() to sort the array with a user-supplied comparison function, keeping the keys of the associative array.

function compare_first_key_date($a, $b) {
    $a_keys = array_keys($a);
    $a_date = strtotime($a_keys[0]);
    $b_keys = array_keys($b);
    $b_date = strtotime($b_keys[0]);
    return $a_date - $b_date;
}
uasort($array, 'compare_first_key_date');

Upvotes: 4

Related Questions