0
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?

5
  • Use usort() and provide a function that gets the first key from array_keys() of each element, converts them to a date, and compares them. Commented Sep 29, 2016 at 1:06
  • Also, if you can setup the arrays so they use timestamps instead of dates it would be a lot easier to sort. Commented Sep 29, 2016 at 1:07
  • @Barmar the usort() function will assign new keys to the original outer array which I do not want to happen. I'm aware of uksort() but that will send the keys of the outer array to be sorted which is again not what I'm trying to do. Commented Sep 29, 2016 at 1:15
  • 1
    Sorry, uasort(). That sorts the values and keeps the key associations. Commented Sep 29, 2016 at 1:15
  • @Barmar thank you! i wasn't aware of the uasort() function. Commented Sep 29, 2016 at 1:22

2 Answers 2

4

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');
Sign up to request clarification or add additional context in comments.

Comments

0

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',
  ),
)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.