كيفية تحويل جميع مفاتيح متعددة dimenional مجموعة snake_case?

StackOverflow https://stackoverflow.com/questions/1444484

سؤال

أنا أحاول تحويل مفاتيح متعددة الأبعاد مجموعة من CamelCase إلى snake_case مع التعقيدات وأضاف أن بعض مفاتيح علامة التعجب التي أريد إزالتها.

على سبيل المثال:

$array = array(
  '!AccountNumber' => '00000000',
  'Address' => array(
    '!Line1' => '10 High Street',
    '!line2' => 'London'));

أود أن تحويل إلى:

$array = array(
  'account_number' => '00000000',
  'address' => array(
    'line1' => '10 High Street',
    'line2' => 'London'));

حياتي الحقيقية مجموعة ضخمة ويذهب العديد من المستويات العميقة.أي مساعدة في كيفية التعامل مع هذا هو محل تقدير كبير!

هل كانت مفيدة؟

المحلول

وهذه هي وظيفة معدلة ولقد استخدمت، والتي اتخذت من استجابة soulmerge ل:

function transformKeys(&$array)
{
  foreach (array_keys($array) as $key):
    # Working with references here to avoid copying the value,
    # since you said your data is quite large.
    $value = &$array[$key];
    unset($array[$key]);
    # This is what you actually want to do with your keys:
    #  - remove exclamation marks at the front
    #  - camelCase to snake_case
    $transformedKey = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', ltrim($key, '!')));
    # Work recursively
    if (is_array($value)) transformKeys($value);
    # Store with new key
    $array[$transformedKey] = $value;      
    # Do not forget to unset references!
    unset($value);
  endforeach;
}

نصائح أخرى

وهنا نسخة أكثر عمومية من آرون. وبهذه الطريقة يمكنك مجرد سد وظيفة تريد أن تعمل على جميع المفاتيح. توليت فئة ثابتة.

public static function toCamelCase ($string) {
  $string_ = str_replace(' ', '', ucwords(str_replace('_',' ', $string)));
  return lcfirst($string_);
}

public static function toUnderscore ($string) {
  return strtolower(preg_replace('/([^A-Z])([A-Z])/', "$1_$2", $string));
}

// http://stackoverflow.com/a/1444929/632495
function transformKeys($transform, &$array) {
  foreach (array_keys($array) as $key):
    # Working with references here to avoid copying the value,
    # since you said your data is quite large.
    $value = &$array[$key];
    unset($array[$key]);
    # This is what you actually want to do with your keys:
    #  - remove exclamation marks at the front
    #  - camelCase to snake_case
    $transformedKey = call_user_func($transform, $key);
    # Work recursively
    if (is_array($value)) self::transformKeys($transform, $value);
    # Store with new key
    $array[$transformedKey] = $value;
    # Do not forget to unset references!
    unset($value);
  endforeach;
}

public static function keysToCamelCase ($array) {
  self::transformKeys(['self', 'toCamelCase'], $array);
  return $array;
}

public static function keysToUnderscore ($array) {
  self::transformKeys(['self', 'toUnderscore'], $array);
  return $array;
}

وعلى الرغم من أن هذا قد لا يكون الجواب الدقيق على هذا السؤال، لكنني أرغب في وظيفة هنا بالنسبة للأشخاص الذين يبحثون عن حل أنيق لتغيير مفتاح القضية في المصفوفات PHP متعددة الأبعاد. يمكنك أيضا تكييفه لتغيير مفاتيح مجموعة بشكل عام. مجرد دعوة وظيفة مختلفة بدلا من array_change_key_case_recursive

// converts all keys in a multidimensional array to lower or upper case
function array_change_key_case_recursive($arr, $case=CASE_LOWER)
{
  return array_map(function($item)use($case){
    if(is_array($item))
        $item = array_change_key_case_recursive($item, $case);
    return $item;
  },array_change_key_case($arr, $case));
}

ويمكنك تشغيل foreach على مفاتيح المصفوفات، وبهذه الطريقة سوف إعادة تسمية مفاتيح في نفس المكان:

function transformKeys(&$array) {
    foreach (array_keys($array) as $key) {
        # This is what you actually want to do with your keys:
        #  - remove exclamation marks at the front
        #  - camelCase to snake_case
        $transformedKey = ltrim($key, '!');
        $transformedKey = strtolower($transformedKey[0] . preg_replace('/[A-Z]/', '_$0', substr($transformedKey, 1)));
        # Store with new key
        $array[$transformedKey] = &$array[$key];
        unset($array[$key]);
        # Work recursively
        if (is_array($array[$transformedKey])) {
            transformKeys($array[$transformedKey]);
        }
    }
}

وإنشاء دالة مثل:

   function convertToCamelCase($array){

           $finalArray     =       array();

           foreach ($array as $key=>$value):

                    if(strpos($key, "_"))
                            $key                    =       lcfirst(str_replace("_", "", ucwords($key, "_"))); //let's convert key into camelCase


                    if(!is_array($value))
                            $finalArray[$key]       =       $value;
                    else
                            $finalArray[$key]       =       $this->_convertToCamelCase($value );
            endforeach;

            return $finalArray;
}

وهذه الكلمة مثل:

$newArray = convertToCamelCase($array);

رؤية هذا

أود أن أقول لك أن كتابة دالة على نسخ مجموعة (مستوى واحد) و يجب أن وظيفة الدعوة نفسها إذا كان أي من القيم هو صفيف (الدالة).

  • فإن علامات التعجب يتم إزالتها بسهولة باستخدام trim()
  • تسطير أسفل السطر قبل الأحرف الكبيرة في منتصف يمكن إضافتها باستخدام التعابير المنطقية
  • بعد إضافة تسطير أسفل السطر كله الرئيسية يمكن تحويلها إلى انخفاض الحالة

بالضبط ما كنت بحاجة إلى أي مساعدة محددة ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top