我正在尝试创建一个函数来转换Multidemnsional数组中的所有键(from / to)camel case。问题是,当我有一个数组数组时,内部数组作为数组的最后一个元素出来,我无法弄清楚为什么..
这是功能:
function transformKeys(&$array, $direction = 'to')
{
if (is_array($array)) {
foreach (array_keys($array) as $key) {
$value = &$array[$key];
unset($array[$key]);
if ($direction == 'to')
$transformedKey = toCamelCase($key);
else
$transformedKey = fromCamelCase($key);
if (is_array($value))
transformKeys($value, $direction);
if (isset($array[$transformedKey]) && is_array($array[$transformedKey])) {
$array[$transformedKey] = array_merge($array[$transformedKey], $value);
}
else
$array[$transformedKey] = $value;
unset($value);
}
}
return $array;
}
function toCamelCase($string, $sepp = '_')
{
$str = str_replace(' ', '', ucwords(str_replace($sepp, ' ', $string)));
$str[0] = strtolower($str[0]);
return $str;
}
function fromCamelCase($string, $sepp = '_')
{
preg_match_all('!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', $string, $matches);
$ret = $matches[0];
foreach ($ret as &$match) {
$match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match);
}
return implode($sepp, $ret);
}
数组是这样的......
{
"id": 23,
"name": "FOO SA",
"taxIdentifier_id": "309",
"activityType": "UTILITY",
"currencyCode": "USD",
"contacts": [
{
"id": 7,
"firstName": "Bla",
"lastName": "Bla",
"gender": "M",
"supplierId": 23
},
{
"id": 8,
"firstName": "Another",
"lastName": "Value",
"gender": "M",
"supplierId": 23
}
]
}
和结果......
Array
(
[id] => 23
[name] => FOO SA
[tax_identifier_id] => 309
[activity_type] => UTILITY
[currency_code] => USD
[contacts] => Array
(
[] => Array
(
[id] => 8
[first_name] => Another
[last_name] => Value
[gender] => M
[supplier_id] => 23
)
)
)
任何想法?
谢谢!
答案 0 :(得分:2)
您的fromCamelCase()
函数为数值数组键提供了错误的值:
var_dump(fromCamelCase(1)); // string(0) ""
这是一个没有这种缺点的实现:
function fromCamelCase($key)
{
return strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $key));
}
我也对你的设计进行了一些简化;我没有使用固定的功能,而是使它成为通用的:
function array_changekey_recursive(array &$array, $callback)
{
foreach ($array as $key => &$value) {
if (is_array($value)) {
array_changekey_recursive($value, $callback);
}
$new_key = call_user_func($callback, $key);
// only update where necessary
if (strcmp($new_key, $key) != 0) {
unset($array[$key]);
$array[$new_key] = $value;
}
}
}
要打电话:
array_changekey_recursive($arr, 'fromCamelCase');