Альтернативы для передачи ключа и значения по ссылке:

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

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

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


person Ben    schedule 30.09.2011    source источник
comment
Это заслуживает большого старого Почему? Что, если sec($key) приведет к значению другого существующего ключа? Вы просто перезаписываете существующий ключ? Вам нужно объяснить, почему в вашем приложении ключ может быть опасен.   -  person webbiedave    schedule 01.10.2011
comment
Почему это не может быть опасно? Вы можете легко изменить ключи $_POST в формах или с помощью чего-то вроде Tamperdata. Некоторые ключи, которые я использую в запросах mysql.   -  person Ben    schedule 01.10.2011
comment
Я не говорил, что их не может быть. Я сказал, что вам нужно объяснить, почему в вашем приложении ключ может быть опасен. Это подскажет нам, какой подход лучше всего использовать в вашей ситуации.   -  person webbiedave    schedule 01.10.2011
comment
Ну, я часто меняю ключи и значения, не только для mysql. Я изучаю PDO и подготовленные операторы медленно, поэтому он будет применяться там меньше... Но, скажем, я хочу заменить строку как в ключе, так и в значении массива, или перейти на верхний регистр, или сделать любое количество вещей.   -  person Ben    schedule 01.10.2011


Ответы (2)


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

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

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

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

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

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

person webbiedave    schedule 30.09.2011

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

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

$where = secureMyArray($where);

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

person Zak    schedule 30.09.2011