11
votes

Comment convertir toutes les clés d'un tableau multidimensionnel en snake_case?

J'essaie de convertir les clés d'un tableau multidimensionnel de Camelcase en Snake_Cêche, avec la complication ajoutée que certaines touches ont une marque d'exclamation que j'aimerais supprimer.

Par exemple: < Pré> xxx

Je souhaite convertir en: xxx

mon réseau réel est énorme et passe de nombreux niveaux profonds. Toute aide avec la façon d'approcher cela est très appréciée!


4 commentaires

«Étui de serpent» ressemble à des "minuscules" pour moi. YA Apprenez quelque chose de nouveau chaque jour.


Utilisez foreach () dans une fonction récursive!


Ok, je vois la différence maintenant - Snake_case a des traits de soulignement au lieu des espaces.


@Pavium: avec la différence d'un _ si le caractère majuscule est au milieu du mot ...


7 Réponses :


0
votes

Je dirais que vous devriez avoir à écrire une fonction pour copier le tableau (un niveau) et que cette fonction s'appelle lui-même si l'une des valeurs est une matrice (une fonction récursive).

  • Les marques d'exclamation sont facilement supprimées à l'aide de la garniture ()
  • Le soulignement avant que les caractères majuscules du milieu puisse être ajouté à l'aide d'une regex
  • Après avoir ajouté le soulignement, la touche entière peut être convertie en minuscule

    Qu'avez-vous besoin exactement d'aide spécifique avec?


0 commentaires

1
votes

Vous pouvez exécuter une foreach sur les clés de tableaux, de cette façon, vous renommez les clés in-place: xxx


2 commentaires

Merci pour cela, ça me met dans la bonne direction, mais il y avait quelques problèmes. Tout d'abord, la D $ TransformedKey Craiterait des résultats étranges, donc j'ai légèrement modifié cette ligne. De plus, l'instruction récursive si la déclaration doit être positionnée au-dessus de la ligne stockant la nouvelle clé de la matrice pour une raison quelconque. Je posterai ma fonction modifiée ci-dessous.


Vient de remarquer, devrait être réparé maintenant.



14
votes

Ceci est la fonction modifiée que j'ai utilisée, prise de la réponse de 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;
}


0 commentaires

2
votes

Bien que cela ne soit peut-être pas une réponse exacte à la question, mais je voulais le poster ici pour les personnes qui recherchent une solution élégante pour changer de cas de clé dans des tableaux PHP multidimensionnels. Vous pouvez également l'adapter pour changer les clés de tableau en général. Appelez simplement une fonction différente au lieu de 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));
}


0 commentaires

4
votes

Voici une version plus généralisée d'Aaron. De cette façon, vous pouvez simplement brancher la fonction que vous souhaitez opérer sur toutes les clés. J'ai supposé une classe statique.

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


0 commentaires

1
votes

Créer une fonction comme: xxx

et appelez ceci comme: xxx

pour l'exemple de travail Voir ce


0 commentaires

1
votes
<?php

class Maison {
    
    public $superficieAll_1;
    public $addressBook;
    
}

class Address { 
    public $latitudeAmi;
    public $longitude;
}

$maison = new Maison();
$maison->superficieAll_1 = 80;
$maison->addressBook->longitudeAmi = 2;
$maison->addressBook->latitude = 4;

$returnedArray = transformation($maison);
print_r($returnedArray);

function transformation($obj){
    //object to array
    $array = json_decode(json_encode((array) $obj),true);
    //now transform all array keys
    return transformKeys($array);
}    

function transformKeys($array)
{
    foreach ($array as $key => $value){
        // echo "$key <br>";
        unset($array[$key]);
        $transformedKey = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', ltrim($key, '!')));
        $array[$transformedKey] = $value;  
        // echo "$transformedKey update <br>";
        if (is_array($value)) {
            $array[$transformedKey] = transformKeys($value);
        }
    }
    return $array;
}

0 commentaires