-// Count leaves (A leaf = value that is not an array, or an empty array)
-function array_count_leaves($array = array(), $count_empty = FALSE)
-{
- if (! is_array($array) || (empty($array) && $count_empty)) return 1;
-
- // Recurse
- $count = 0;
- foreach ($array as $part) {
- $count += array_count_leaves($part, $count_empty);
- }
- return $count;
-}
-
-// Merge two leaves
-// Similar to PHP array_merge_leaves(), except strictly preserving keys as string
-function array_merge_leaves($array1, $array2, $sort_keys = TRUE)
-{
- // Array(s) only
- $is_array1 = is_array($array1);
- $is_array2 = is_array($array2);
- if ($is_array1) {
- if ($is_array2) {
- ; // Pass
- } else {
- return $array1;
- }
- } else if ($is_array2) {
- return $array2;
- } else {
- return $array2; // Not array ($array1 is overwritten)
- }
-
- $keys_all = array_merge(array_keys($array1), array_keys($array2));
- if ($sort_keys) sort($keys_all, SORT_STRING);
-
- $result = array();
- foreach($keys_all as $key) {
- $isset1 = isset($array1[$key]);
- $isset2 = isset($array2[$key]);
- if ($isset1 && $isset2) {
- // Recurse
- $result[$key] = array_merge_leaves($array1[$key], $array2[$key], $sort_keys);
- } else if ($isset1) {
- $result[$key] = & $array1[$key];
- } else {
- $result[$key] = & $array2[$key];
- }
- }
- return $result;
-}
-
-// An array-leaves to a flat array
-function array_flat_leaves($array, $unique = TRUE)
-{
- if (! is_array($array)) return $array;
-
- $tmp = array();
- foreach(array_keys($array) as $key) {
- if (is_array($array[$key])) {
- // Recurse
- foreach(array_flat_leaves($array[$key]) as $_value) {
- $tmp[] = $_value;
- }
- } else {
- $tmp[] = & $array[$key];
- }
- }
-
- return $unique ? array_values(array_unique($tmp)) : $tmp;
-}
-
-// $array['something'] => $array['wanted']
-function array_rename_keys(& $array, $keys = array('from' => 'to'), $force = FALSE, $default = '')
-{
- if (! is_array($array) || ! is_array($keys)) return FALSE;
-
- // Nondestructive test
- if (! $force) {
- foreach(array_keys($keys) as $from) {
- if (! isset($array[$from])) {
- return FALSE;
- }
- }
- }
-
- foreach($keys as $from => $to) {
- if ($from === $to) continue;
- if (! $force || isset($array[$from])) {
- $array[$to] = & $array[$from];
- unset($array[$from]);
- } else {
- $array[$to] = $default;
- }
- }
-
- return TRUE;
-}
-
-// Remove redundant values from array()
-function array_unique_recursive($array = array())
-{
- if (! is_array($array)) return $array;
-
- $tmp = array();
- foreach($array as $key => $value){
- if (is_array($value)) {
- $array[$key] = array_unique_recursive($value);
- } else {
- if (isset($tmp[$value])) {
- unset($array[$key]);
- } else {
- $tmp[$value] = TRUE;
- }
- }
- }
-
- return $array;
-}