diff --git a/cache/renderer.php b/cache/renderer.php index 685b8389953..c643dd3caf1 100644 --- a/cache/renderer.php +++ b/cache/renderer.php @@ -235,6 +235,8 @@ class core_cache_renderer extends plugin_renderer_base { ); $table->data = array(); + core_collator::asort_array_of_arrays_by_key($definitions, 'name'); + $none = new lang_string('none', 'cache'); foreach ($definitions as $id => $definition) { $actions = cache_administration_helper::get_definition_actions($context, $definition); diff --git a/lib/classes/collator.php b/lib/classes/collator.php index ad779f292ed..398ff67dbf2 100644 --- a/lib/classes/collator.php +++ b/lib/classes/collator.php @@ -284,6 +284,46 @@ class core_collator { return $result; } + /** + * Locale aware sort of array of arrays. + * + * Given an array like: + * $array = array( + * array('name' => 'bravo'), + * array('name' => 'charlie'), + * array('name' => 'alpha') + * ); + * + * If you call: + * core_collator::asort_array_of_arrays_by_key($array, 'name') + * + * You will be returned $array sorted by the name key of the subarrays. e.g. + * $array = array( + * array('name' => 'alpha'), + * array('name' => 'bravo'), + * array('name' => 'charlie') + * ); + * + * @param array $array An array of objects to sort (handled by reference) + * @param string $key The key to use for comparison + * @param int $sortflag One of + * core_collator::SORT_NUMERIC, + * core_collator::SORT_STRING, + * core_collator::SORT_NATURAL, + * core_collator::SORT_REGULAR + * optionally "|" core_collator::CASE_SENSITIVE + * @return bool True on success + */ + public static function asort_array_of_arrays_by_key(array &$array, $key, $sortflag = core_collator::SORT_STRING) { + $original = $array; + foreach ($array as $initkey => $item) { + $array[$initkey] = $item[$key]; + } + $result = self::asort($array, $sortflag); + self::restore_array($array, $original); + return $result; + } + /** * Locale aware sorting, the key associations are kept, keys are sorted alphabetically. * diff --git a/lib/tests/collator_test.php b/lib/tests/collator_test.php index 57111577296..f962480b188 100644 --- a/lib/tests/collator_test.php +++ b/lib/tests/collator_test.php @@ -198,6 +198,48 @@ class core_collator_testcase extends advanced_testcase { $this->assertTrue($result); } + /** + * Tests the sorting of an array of arrays by key. + */ + public function test_asort_array_of_arrays_by_key() { + $array = array( + 'a' => array('name' => 'bravo'), + 'b' => array('name' => 'charlie'), + 'c' => array('name' => 'alpha') + ); + $this->assertSame(array('a', 'b', 'c'), array_keys($array)); + $this->assertTrue(core_collator::asort_array_of_arrays_by_key($array, 'name')); + $this->assertSame(array('c', 'a', 'b'), array_keys($array)); + + $array = array( + 'a' => array('name' => 'b'), + 'b' => array('name' => 1), + 'c' => array('name' => 0) + ); + $this->assertSame(array('a', 'b', 'c'), array_keys($array)); + $this->assertTrue(core_collator::asort_array_of_arrays_by_key($array, 'name')); + $this->assertSame(array('c', 'b', 'a'), array_keys($array)); + + $array = array( + 'a' => array('name' => 'áb'), + 'b' => array('name' => 'ab'), + 1 => array('name' => 'aa'), + 'd' => array('name' => 'cc'), + 0 => array('name' => 'Áb') + ); + $this->assertSame(array('a', 'b', 1, 'd', 0), array_keys($array)); + $this->assertTrue(core_collator::asort_array_of_arrays_by_key($array, 'name')); + $this->assertSame(array(1, 'b', 'a', 0, 'd'), array_keys($array)); + $this->assertSame(array( + 1 => array('name' => 'aa'), + 'b' => array('name' => 'ab'), + 'a' => array('name' => 'áb'), + 0 => array('name' => 'Áb'), + 'd' => array('name' => 'cc') + ), $array); + + } + /** * Returns an array of sorted names. * @param array $objects