2011-05-22 3 views
0

Possible en double:
Check if a “run-time” multidimensional array key existsVérifiez si une clé de tableau multidimensionnel « run-time » existe

Salut,

J'ai un tableau multidimensionnel. J'ai besoin d'une fonction qui vérifie si une clé spécifiée existe et si elle n'est pas définie.

Prenons ce tableau

$config['lib']['template']['engine'] = false; 

Une fonction ne doit pas mettre à jour la valeur true quand je l'appelle avec:

checkAndSetKey('lib template engine',true); 
//> Checks if isset $config['lib']['template']['engine'] and if not isset $config['lib']['template']['engine'] = true; 

Notez que mon tableau est non seulement 3 dimensions. Il devrait être en mesure de vérifier et régler même avec seulement 1 dimension:

checkAndSetKey('genericSetting',true); 
//> In this considering there isn't any $c['genericSetting'] the function set the key to true; 

En ce moment je suis en utilisant un code d'eval terrible, je voudrais entendre suggérer :)

Pour vérifier dynamiquement si la clé existe il pourrait être utilisé ce code:

$array = $config; 
$keys=explode(' ',$argument1); 

foreach($keys as $v) { 

    if (!array_key_exists($v,$array)) { 
     //> [todo!] the current key doens't exist now we should set the value 
    } 

    $array = &$array[$v]; 
} 
+0

peut être utile: http://stackoverflow.com/questions/6088115/transform-flat-array-into-a-hierarchical-multi-dimensional-array Il n » Cela ressemble à un bon moyen de changer les paramètres. –

+0

C'était ma propre question. Et ils ne sont pas DUP parce que cette question était seulement pour voir si c'était à ne pas mettre. Lire mieux la prochaine fois –

+0

je suppose que si jeff le ferme je dirai n'importe quoi xD –

Répondre

0

LOL En fait, c'était juste une ligne de code ajouté il y a =/
Pour un instant, les références me confondre un peu.

Voici le code:

function _c($key,$value) { 
    global $c; 

    $array = &$c; 
    $keys = explode(' ',$key); 

    $setValue = false; 
    for($i=0;$i<count($keys);$i++) { 
     $v = $keys[$i]; 

     //> If setValue is already = true we don't need to check it again 
     if (!$setValue && !array_key_exists($v,$array)) 
      $setValue = true; 

     $array = &$array[$v]; 
    } 

    if ($setValue) 
     $array = $value; 
} 

//> Usage _c('lib template engine',true); 
+0

Vous pouvez changer la boucle 'foreach' en' for' pour parcourir toutes les clés données.Maintenant, quand vous appelez '_c ('lib template engine', true);' avec emty '$ c', vous finirez par' $ c = array ('lib' => true); 'et même l'appeler 3 fois ne pas régler la touche désirée –

+0

oui il y a quelques erreurs avec un $ c vide. J'ai besoin de chose à propos d'une solution – dynamic

+0

@ dev-null-dweller: édité la réponse. Maintenant basé sur le var $ setValue sera placé dans le bon tableau – dynamic

0

Tout d'abord, sa valeur en gardant à l'esprit que les tableaux PHP ne sont pas multi-dimensionnelle, ils sont hiérarchiques. PHP fournit déjà une méthode pour tester si array key exists Enroulant dans votre propre code devrait être trivial, en particulier si le nombre de niveaux dans le tableau est fixe:

function checkAndSetKey(&$arr, $path, $default) 
{ 
    $path=explode(' ', $path); 

    if (!is_array($arr[$path[0]])) { // lib 
     $arr[$path[0]]=array(); 
    } 
    if (!is_array($arr[$path[0]][$path[1]])) { // template 
     $arr[$path[0]][$path[1]]=array(); 
    } 
    if (!array_key_exists($path[2],$arr[$path[0]][$path[1]])) { // engine 
     $arr[$path[0]][$path[1]][$path[2]]=$default; 
    } 
    return $arr[$path[0]][$path[1]][$path[2]]; 
} 

Avec un peu de bien que la méthode ci-dessus pourrait être adaptée en utilisant la récursivité pour traiter un nombre arbitraire de niveaux.

+0

je ne trouve pas un moyen dans votre code avec récursivité pour le faire pour le numéro d'arbitrage – dynamic

1

Avec une légère modification (tableau passant comme argument de référence) cela devrait fonctionner:

function checkAndSetKey(&$arr, $keys, $value){ 
    $moreKeys = strpos($keys,' '); 
    if($moreKeys !== FALSE){ 
     $currentKey = substr($keys, 0, $moreKeys); 
     $keys = substr($keys, $moreKeys+1); 

     if(!isset($arr[$currentKey]) || !is_array($arr[$currentKey])) 
      $arr[$currentKey] = array(); 

     return checkAndSetKey($arr[$currentKey], $keys, $value); 
    }else{ 
     $currentKey = $keys; 
     if(!isset($arr[$currentKey])) 
      $arr[$currentKey] = $value; 

     return $arr[$currentKey]; 
    } 
} 
+0

sans ces grands si le code aurait eu l'air beautfiul – dynamic

+0

Le code devrait être efficace, lisible et réutilisable - ce qui le rend beau. –

Questions connexes