Snake_case bir çoklu-dimenional dizideki tüm anahtarları dönüştürmek nasıl?

4 Cevap php

Ben bazı tuşlar hoşuma kaldırıldı istediğiniz bir ünlem işareti var ekledi komplikasyon ile, snake_case için CamelCase bir çok boyutlu dizinin anahtarlarını dönüştürmek çalışıyorum.

Örneğin:

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

Ben dönüştürmek istiyorum:

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

Benim gerçek hayat dizisi büyük ve pek çok düzeyde derin gider. Bu yaklaşım nasıl Herhangi bir yardım çok takdir!

4 Cevap

Bu soulmerge yanıtı alınan ben kullandım modifiye fonksiyonudur:

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;
}

Sen diziler tuşları, sen yerinde tuşlarını yeniden adlandırmak gerekir bu yolda bir foreach çalıştırabilirsiniz:

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]);
        }
    }
}

Ben dizi (tek seviye) kopyalama ve değerlerin herhangi bir dizi (özyinelemeli bir işlev) ise bu işlevi kendisini aramak için bir fonksiyon yazmak zorunda olacağını söyleyebilirim.

  • Ünlem işaretleri kolayca) (Döşeme kullanarak kaldırılır
  • Ortada büyük harflerde önce çizgi bir regex kullanarak eklenebilir
  • Çizgi ilave edildikten sonra, bütün önemli alt durumda dönüştürülebilir

Tam olarak ne ile herhangi bir yardıma ihtiyacım var?

Bu soruya kesin bir cevap olmayabilir, ama ben çok boyutlu PHP diziler anahtar harf değiştirme için zarif bir çözüm arıyor insanlar için burada yayınlamak istedim rağmen. Siz de genel olarak dizi anahtarları değiştirmek için uyarlayabilirsiniz. Sadece yerine array_change_key_case_recursive farklı bir işlevi çağırmak

// 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));
}