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: P> < Pré> xxx pré>
Je souhaite convertir en: p> 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! P> p>
7 Réponses :
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). P>
Qu'avez-vous besoin exactement d'aide spécifique avec? P>
Vous pouvez exécuter une foreach sur les clés de tableaux, de cette façon, vous renommez les clés in-place:
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.
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;
}
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));
}
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;
}
Créer une fonction comme: et appelez ceci comme: p> pour l'exemple de travail Voir ce P> p>
<?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;
}
«É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 ...