multibyte and multi-dimensional-array support, have fun!
<?php
define('ARRAY_KEY_FC_LOWERCASE', 25); //FOO => fOO
define('ARRAY_KEY_FC_UPPERCASE', 20); //foo => Foo
define('ARRAY_KEY_UPPERCASE', 15); //foo => FOO
define('ARRAY_KEY_LOWERCASE', 10); //FOO => foo
define('ARRAY_KEY_USE_MULTIBYTE', true); //use mutlibyte functions
/**
* change the case of array-keys
*
* use: array_change_key_case_ext(array('foo' => 1, 'bar' => 2), ARRAY_KEY_UPPERCASE);
* result: array('FOO' => 1, 'BAR' => 2)
*
* @param array
* @param int
* @return array
*/
function array_change_key_case_ext(array $array, $case = 10, $useMB = false, $mbEnc = 'UTF-8') {
$newArray = array();
//for more speed define the runtime created functions in the global namespace
//get function
if($useMB === false) {
$function = 'strToUpper'; //default
switch($case) {
//first-char-to-lowercase
case 25:
//maybee lcfirst is not callable
if(!function_exists('lcfirst'))
$function = create_function('$input', '
return strToLower($input[0]) . substr($input, 1, (strLen($input) - 1));
');
else $function = 'lcfirst';
break;
//first-char-to-uppercase
case 20:
$function = 'ucfirst';
break;
//lowercase
case 10:
$function = 'strToLower';
}
} else {
//create functions for multibyte support
switch($case) {
//first-char-to-lowercase
case 25:
$function = create_function('$input', '
return mb_strToLower(mb_substr($input, 0, 1, \'' . $mbEnc . '\')) .
mb_substr($input, 1, (mb_strlen($input, \'' . $mbEnc . '\') - 1), \'' . $mbEnc . '\');
');
break;
//first-char-to-uppercase
case 20:
$function = create_function('$input', '
return mb_strToUpper(mb_substr($input, 0, 1, \'' . $mbEnc . '\')) .
mb_substr($input, 1, (mb_strlen($input, \'' . $mbEnc . '\') - 1), \'' . $mbEnc . '\');
');
break;
//uppercase
case 15:
$function = create_function('$input', '
return mb_strToUpper($input, \'' . $mbEnc . '\');
');
break;
//lowercase
default: //case 10:
$function = create_function('$input', '
return mb_strToLower($input, \'' . $mbEnc . '\');
');
}
}
//loop array
foreach($array as $key => $value) {
if(is_array($value)) //$value is an array, handle keys too
$newArray[$function($key)] = array_change_key_case_ex($value, $case, $useMB);
elseif(is_string($key))
$newArray[$function($key)] = $value;
else $newArray[$key] = $value; //$key is not a string
} //end loop
return $newArray;
}
?>
array_change_key_case
(PHP 4 >= 4.2.0, PHP 5)
array_change_key_case — Modifică toate cheile dintr-un tablou
Descrierea
$input
[, int $case = CASE_LOWER
] )
Întoarce un tablou cu toate cheile din input
transferate în caractere minuscule sau majuscule. Indicii-numere rămân precum
sunt.
Parametri
-
input -
Tabloul asupra căruia se lucrează
-
case -
Poate lua valoarea
CASE_UPPERsauCASE_LOWER(implicit)
Valorile întoarse
Întoarce un tablou cu cheile transferate în caractere minuscule sau majuscule,
sau FALSE dacă input nu este un tablou.
Erori/Excepții
Aruncă E_WARNING dacă input nu
este un tablou.
Exemple
Example #1 Exemplu array_change_key_case()
<?php
$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));
?>
Exemplul de mai sus va afișa:
Array
(
[FIRST] => 1
[SECOND] => 4
)
Note
Notă:
Dacă un tablou are indici care vor deveni la fel odată ce se va rula această funcție (de ex. "keY" și "kEY"), valoarea cea mai de pe urmă din tablou se va suprapune peste ceilalți indici.
Unicode example;
<?php
function array_change_key_case_unicode($arr, $c = CASE_LOWER) {
$c = ($c == CASE_LOWER) ? MB_CASE_LOWER : MB_CASE_UPPER;
foreach ($arr as $k => $v) {
$ret[mb_convert_case($k, $c, "UTF-8")] = $v;
}
return $ret;
}
$arr = array("FirSt" => 1, "yağ" => "Oil", "şekER" => "sugar");
print_r(array_change_key_case($arr, CASE_UPPER));
print_r(array_change_key_case_unicode($arr, CASE_UPPER));
?>
Array
(
[FIRST] => 1
[YAğ] => Oil
[şEKER] => sugar
)
Array
(
[FIRST] => 1
[YAĞ] => Oil
[ŞEKER] => sugar
)
<?php
function array_change_value_case($input, $case = CASE_LOWER)
{
$aRet = array();
if (!is_array($input))
{
return $aRet;
}
foreach ($input as $key => $value)
{
if (is_array($value))
{
$aRet[$key] = array_change_value_case($value, $case);
continue;
}
$aRet[$key] = ($case == CASE_UPPER ? strtoupper($value) : strtolower($value));
}
return $aRet;
}
?>
Script to change case of sub-arrays keys to lower . It works well for me. hope it helps.
<?php
$array=array("First"=>"val1","SecoNd"=>"val2",
"third"=>array("third-INner1"=>"val3.1"),
"fourth"=>array("FouthINNer1"=>"val4.1","FourthINNER2"=>"val4.2"));
print_r($array);
$key=array_keys($array);
foreach($key as $ki)
{
$klower=strtolower($ki);
$val=$array[$ki];
if(is_array($val))
{
foreach($val as $kinner=>$vinner)
{
$tl=strtolower($kinner);
unset($val[$kinner]);
$val[$tl]=$vinner;
}
}
unset($array[$ki]);
$array[$klower]=$val;
}
echo "<br> After Changing Key to-LowerCase : <br>";
print_r($array);
?>
Use this to capitalize first letter of all array keys:
<?php
function ucfirstKeys(&$data)
{
foreach ($data as $key => $value)
{
// Convert key
$newKey = ucfirst($key);
// Change key if needed
if ($newKey != $key)
{
unset($data[$key]);
$data[$newKey] = $value;
}
// Handle nested arrays
if (is_array($value))
{
ucfirstKeys($data[$key]);
}
}
}
$test = array('foo' => 'bar', 'moreFoo' => array('more' => 'foo'));
ucfirstKeys($test);
print_r($test);
?>
Result:
Array ( [MoreFoo] => Array ( [More] => foo ) [Foo] => bar )
<?php
// improving the previous script
function ack_r3(&$array, $case=CASE_LOWER, $flag_rec=false)
{
$array = array_change_key_case($array, $case);
if ( $flag_rec ) {
foreach ($array as $key => $value) {
if ( is_array($value) ) {
ack_r3($array[$key], $case, true);
}
}
}
}
// same of array_change_key_case
$arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
ack_r3($arr, CASE_LOWER,false);
var_dump($arr);
$arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
ack_r3($arr, CASE_LOWER,true);
var_dump($arr);
?>
outputs:
array(3) {
["id"]=>
int(1)
["name"]=>
string(4) "Luis"
["contact"]=>
array(2) {
["PHONE"]=>
string(9) "3010-7148"
["E-MAIL"]=>
string(12) "luis@net.com"
}
}
array(3) {
["id"]=>
int(1)
["name"]=>
string(4) "Luis"
["contact"]=>
array(2) {
["phone"]=>
string(9) "3010-7148"
["e-mail"]=>
string(12) "luis@net.com"
}
}
Script to change case of sub-arrays keys:
<?php
function arrKey2Lower(&$arrVals) {
foreach( $arrVals as $key => $item ) {
$key2 = strtolower($key);
if ( $key2 != $key) {
unset($arrVals[$key]);
$arrVals[$key2]=$item;
$key=$key2;
}
if ( is_array($item) ) { arrKey2Lower($arrValores[$key]); }
}
}
$arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
arrKey2Lower($arr);
var_dump($arr);
?>
outputs:
array(3) {
["id"]=>
int(1)
["name"]=>
string(4) "Luis"
["contact"]=>
array(2) {
["phone"]=>
string(9) "3010-7148"
["e-mail"]=>
string(12) "luis@net.com"
}
}
<?php
$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));
?>
Basically this is the function if your version is lower than 4.2.0
<?php
if ( !defined('CASE_LOWER') )define('CASE_LOWER', 0);
if ( !defined('CASE_UPPER') )define('CASE_UPPER', 1);
if(!function_exists("array_change_key_case")){
function array_change_key_case($input, $case=0){
if(!is_array($input))return FALSE;
$product = array();
foreach($input as $key => $value){
if($case){ //Upper
$key2 = ( (is_string($key)) ? (strtoupper($key)) : ($key) );
$product[$key2] = $value;
}
else{ //Lower
$key2 = ( (is_string($key)) ? (strtolower($key)) : ($key) );
$product[$key2] = $value;
}
}
return $product;
}/* endfunction array_change_key_case */
}/* endfunction exists array_change_key_case*/
?>
Simple function to change multidimensional array's all values to uppercase. If you would like to change to lowercase then change "mb_strtoupper" to "mb_strtolower". It works perfect for me ;)
<?php
function change_case_recursive($arr){
foreach ($arr as $key=>$val){
if (!is_array($arr[$key])){
$arr[$key]=mb_strtoupper($arr[$key]);
}else{
$arr[$key]=change_case_recursive($arr[$key]);
}
}
return $arr;
}
?>
This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat
I just changed the code a little bit so you havent got a code that repeats itself.
<?php
function array_change_key_case_secure($array = array(), $case = CASE_UPPER){
$secure = array();
$functionWrap = array(CASE_UPPER => 'strtoupper',
CASE_LOWER => 'strtolower');
foreach($array as $key => $val){
if(isset($functionWrap[$key])){
$key = $functionWrap[$case]($key);
$secure[$key][] = $val;
} else {
die('Not a known Type');
}
}
foreach($secure as $key => $val){
if(count($secure[$key]) == 1){
$secure[$key] = $val[0];
}
}
return $secure;
}
$myArray = array('A' => 'Hello',
'B' => 'World',
'a' => 'how are you?');
print_r($myArray);
$myArray = array_change_key_case_secure($myArray);
print_r($myArray);
/*
Array
(
[A] => Hello
[B] => World
[a] => how are you?
)
Array
(
[A] => Array
(
[0] => Hello
[1] => how are you?
)
[B] => World
)
*/
Below is a recursive version of this function.
<?php
/**
* A recursive array_change_key_case function.
* @param array $input
* @param integer $case
*/
function array_change_key_case_recursive($input, $case = null){
if(!is_array($input)){
trigger_error("Invalid input array '{$array}'",E_USER_NOTICE); exit;
}
// CASE_UPPER|CASE_LOWER
if(null === $case){
$case = CASE_LOWER;
}
if(!in_array($case, array(CASE_UPPER, CASE_LOWER))){
trigger_error("Case parameter '{$case}' is invalid.", E_USER_NOTICE); exit;
}
$input = array_change_key_case($input, $case);
foreach($input as $key=>$array){
if(is_array($array)){
$input[$key] = array_change_key_case_recursive($array, $case);
}
}
return $input;
}
?>
Same as array_change_key_case only with the values. This should really be part of PHP!
<?php
/**
* @brief Returns an array with all values lowercased or uppercased.
* @return array Returns an array with all values lowercased or uppercased.
* @param object $input The array to work on
* @param int $case [optional] Either \c CASE_UPPER or \c CASE_LOWER (default).
*/
function array_change_value_case(array $input, $case = CASE_LOWER) {
switch ($case) {
case CASE_LOWER:
return array_map('strtolower', $input);
break;
case CASE_UPPER:
return array_map('strtoupper', $input);
break;
default:
trigger_error('Case is not valid, CASE_LOWER or CASE_UPPER only', E_USER_ERROR);
return false;
}
}
?>
