2010-05-23 9 views
3

J'ai un peu mal à la tête. La fonction fait ce que je veux, mais comme je ne connais pas encore bien les fonctions array/looping de PHP, ma question est donc de savoir si une partie de cette fonction pourrait être améliorée du point de vue de la performance.PHP modifiant et combinant le tableau

$var = myFunction (array('key1', 'key2', 'key3', '111')); 

function myFunction ($keys) { 
    $prefix = 'prefix_'; 

    $keyCount = count($keys); 

    // Prefix each key and remove old keys 
    for($i=0;$i<$keyCount; $i++){ 
     $keys[] = $prefix.$keys[$i]; 
     unset($keys[$i]); 
    } 
    // output: array('prefix_key1', 'prefix_key2', 'prefix_key3', '111) 

    // Get all keys from memcached. Only returns valid keys 
    $items = $this->memcache->get($keys); 
    // output: array('prefix_key1' => 'value1', 'prefix_key2' => 'value2', 'prefix_key3'=>'value3) 
    // note: key 111 was not found in memcache. 

    // Fill upp eventual keys that are not valid/empty from memcache 
    $return = $items + array_fill_keys($keys, ''); 
    // output: array('prefix_key1' => 'value1', 'prefix_key2' => 'value2', 'prefix_key3'=>'value3, 'prefix_111' => '') 

    // Remove the prefixes for each result before returning array to application 
    foreach ($return as $k => $v) { 
     $expl = explode($prefix, $k); 
     $return[$expl[1]] = $v; 
     unset($return[$k]); 
    } 

    // output: array('key1' => 'value1', 'key2' => 'value2', 'key3'=>'value3, '111' => '') 

    return $return; 

}

Merci beaucoup!

Edit: psuedo code demandé:

  1. Ajouter préfixes tableau, puisque nous besoin de préfixer toutes les clés pour éviter kes écrasées dans la memcache
  2. Obtenir toutes les clés de memcache
  3. Remplissez les clés éventuels qui ne sont pas valables, car nous voudrions éviter les erreurs « non valides » indice causés par le fait d'une clé demandée ne retourné.
  4. Retirez les préfixes pour faire le formatage des clés plus facile sans en sortie d'avoir à obtenir le préfixe pour chaque valeur.
+1

Pourriez-vous expliquer en pseudo-code exactement ce que vous voulez faire ? – Eric

+0

Message mis à jour. Merci! – Industrial

Répondre

2

Eh bien, personnellement, je n'aime pas modifier un tableau dans une boucle (désactivation, etc). Vous pouvez le faire, mais comment je le ferais (juste mon style) serait la suivante:

function myFunction(array $keys) { 
     $prefixedKeys = array(); 
     $prefix = 'prefix_'; 
     //Since we want the original key later, create a new array of prefixed keys 
     foreach ($keys as $key) { 
      $prefixedKeys[] = $prefix . $key; 
     } 

     $data = $this->memcache->get($prefixedKeys); 

     $return = array(); 
     foreach ($keys as $key) { 
      $prefixedKey = $prefix . $key; 
      //Use the cached key if possible, otherwise default to '' 
      if (isset($data[$prefixedKey])) { 
       $return[$key] = $data[$prefixedKey]; 
      } else { 
       $return[$key] = ''; 
      } 
     } 
     return $return; 
    } 
1

Vous pouvez remplacer:

for($i=0;$i<$keyCount; $i++){ 
    $keys[] = $prefix.$keys[$i]; 
    unset($keys[$i]); 
} 

avec ceci:

foreach($keys as &$key){ 
    $key = $prefix.$key; 
} 
unset($key); //Necessary because the reference needs to be destroyed 

Je ne pense pas que vous vouliez réellement unset($keys[$i]), qu'il vient d'être défait la concaténation.

+0

En fait, le paramètre unset ($ keys [$ i]) supprime la clé d'origine qui n'est pas préfixée? – Industrial

+1

Oui, mais cela est instable, car les clés sont ajoutées à la fin et prises depuis le début. Vous confondez les clés de tableau réelles avec un tableau normal de valeurs que les clés _represent_. 'unset ($ array ['clé'])' supprime l'élément avec une clé de '' clé '' du tableau. – Eric

1

solution Ok, complète:

function myFunction ($keys) 
{ 
    $prefix = 'prefix_'; 

    //Create an array to hold 'prefixedkey' => 'key' pairs 
    $prefixedkeys = array(); 
    foreach($keys as $key) 
    { 
     $prefixedkeys[$prefix.$key] = $key; 
    } 

    //Pass memcache just the prefixed keys 
    $items = $this->memcache->get(array_keys($prefixedkeys)); 

    //Create an array to hold the final results 
    $return = array(); 

    foreach($prefixedkeys as $prefixedkey => $key) 
    { 
     if(!isset($items[$prefixedkey])) 
     { 
      //If the memcache data is not set for the current prefixed key, 
      //set the non-prefixed key in $return to '' 
      $return[$key] = ''; 
     } 
     else 
     { 
      //Otherwise, set it to the memcache data for the current prefixed key 
      $return[$key] = $items[$prefixedkey]; 
     } 
    } 
    return $return; 
}