Альтернативы для передачи ключа и значения по ссылке: - PullRequest
8 голосов
/ 01 октября 2011

Может кто-нибудь объяснить мне, почему вы не можете передать ключ в качестве ссылки?

Ex:

if(is_array($where)){
    foreach($where as &$key => &$value){
        $key = sec($key);
        $value = sec($value);
    }
    unset($key, $value);
}

Выдает:

Fatal error: Key element cannot be a reference in linkstest.php on line 2   

Могу ли я сделать нечто подобное, используя array_map? Все, что я хочу сделать, это перебрать ассоциативный массив и экранировать ключ и значение с помощью моей функции sec ().

Карту массивов мне сложно понять:

Я много чего перепробовал с array_map, но не могу заставить его воздействовать на ключи напрямую.

Получу ли я какой-либо выигрыш в производительности, используя карту массивов, чем просто использование цикла foreach?

Что мне не нравится в foreach, так это то, что я не могу работать с массивом напрямую, и мне приходится иметь дело с созданием временных массивов и их сбросом:

foreach($where as $key => $value){
 $where[secure($key)] = secure($value);
}

Это может произойти сбой, если он найдет что-то, что может скрыться в ключе, добавит новый элемент и сохранит неэкранированный.

Так я застрял с чем-то вроде этого?

$temparr = array();
foreach($where as $key => $value){
 $temparr[secure($key)] = secure($value);
}
$where = $temparr;
unset($temparr);

Есть ли альтернативы?

Ответы [ 2 ]

10 голосов
/ 01 октября 2011

Может кто-нибудь объяснить мне, почему вы не можете передать ключ в качестве ссылки?

Поскольку язык не поддерживает это.Вам будет трудно найти эту способность на большинстве языков, отсюда и термин клавиша .

Так что я застрял с чем-то вроде этого?

Да.Лучший способ - создать новый массив с соответствующими ключами.

Любые альтернативы?

Единственный способ предоставить лучшие альтернативы - это узнать вашу конкретную ситуацию.Если ваши ключи сопоставляются с именами столбцов таблицы, то лучше всего оставить ключи как есть и экранировать их во время использования в вашем SQL.

0 голосов
/ 01 октября 2011

почему это проблема?Сделайте это функцией.Функция принимает входные данные и выдает выходные данные.Ввод вашей функции будет вашим «незащищенным» массивом.Ваш вывод будет результатом защиты массива.

Тогда вы просто делаете

$where = secureMyArray($where);

Вот почему у вас есть возможность создавать функции ...

...