PHP модифицирующий и комбинирующий массив - PullRequest
3 голосов
/ 23 мая 2010

У меня немного болит голова о массиве. Функция делает то, что я хочу, но так как я еще не очень хорошо знаком с PHP: функциями массива / циклов, поэтому, таким образом, мой вопрос, есть ли какая-то часть этой функции, которую можно улучшить с точки зрения производительности? *

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

}

Большое спасибо!

Редактировать: Запрошенный псевдо-код:

  1. Добавить префиксы в массив, так как мы необходимо префикс каждого ключа, чтобы предотвратить kes перезаписывается в memcache
  2. Получить все ключи из memcache
  3. Заполните возможные ключи, которые не действительны, так как мы хотели бы избежать "not-valid-index" ошибки, вызванные факт запрошенного ключа не вернулся.
  4. Удалите префиксы для форматирования выводимых ключей. проще без префикса для каждого значения.

Ответы [ 3 ]

2 голосов
/ 23 мая 2010

Ну, лично мне не нравится модифицировать массив внутри цикла (сброс и т. Д.). Вы можете сделать это, но как бы я это сделал (только мой стиль):

    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 голос
/ 23 мая 2010

Хорошо, полное решение:

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;
}
1 голос
/ 23 мая 2010

Вы можете заменить это:

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

с этим:

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

Я не думаю, что вы на самом деле хотели unset($keys[$i]), так как это просто отменяет объединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...