PHP将键转换为多维数组

时间:2013-07-22 22:34:04

标签: php arrays multidimensional-array

我正在尝试创建一个函数来转换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
                )

        )

)

任何想法?

谢谢!

1 个答案:

答案 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');