Je suis actuellement une application de l'optimisation de PHP et a trouvé une fonction appelée autour 10-20K fois, donc je pensais que je commencerais là optimisation:clés Conversion d'un tableau/objet arbre en minuscules
function keysToLower($obj)
{
if(!is_object($obj) && !is_array($obj)) return $obj;
foreach($obj as $key=>$element)
{
$element=keysToLower($element);
if(is_object($obj))
{
$obj->{strtolower($key)}=$element;
if(!ctype_lower($key)) unset($obj->{$key});
}
else if(is_array($obj) && ctype_upper($key))
{
$obj[strtolower($key)]=$element;
unset($obj[$key]);
}
}
return $obj;
}
La plupart du temps est passé en appels récursifs (qui sont assez lents en PHP), mais je ne vois aucun moyen de le convertir en boucle. Que feriez-vous?
Cette version ne tient pas compte des tableaux associatifs car mes données n'en ont pas, mais est presque 10 fois plus rapide que la version originale. La majeure partie du travail a été faite par Gumbo, l'accélération majeure vient de l'utilisation de références et de la création d'un nouvel objet au lieu de désactiver les anciennes clés.
function &keysToLower(&$obj)
{
if(is_object($obj))
{
$newobj = (object) array();
foreach ($obj as $key => &$val)
$newobj->{strtolower($key)} = keysToLower($val);
$obj=$newobj;
}
else if(is_array($obj))
foreach($obj as &$value)
keysToLower($value);
return $obj;
}
Vous pouvez toujours supprimer facilement les appels récursifs à l'aide d'une pile auxiliaire. – Artefacto
J'ai suggéré array_walk_recursive mais supprimé mon post - Je ne pouvais pas facilement le faire faire ce que vous vouliez, même si vous voudrez peut-être vous pencher sur cette fonction vous-même. – Erik
Apparemment, array_walk_recursive ne considérera pas les éléments créés avec la fonction de rappel. – tstenner