2011-09-30 19 views
7

¿Puede alguien explicarme por qué no puede pasar una clave como referencia?Alternativas para pasar clave y valor por referencia:

Ex:

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

Lanza:

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

¿Puedo hacer algo similar usando array_map? Todo lo que quiero hacer es iterar sobre una matriz asociativa, y escapar de la clave y el valor con mi función sec().

matriz de mapa es difícil de entender para mí:

He intentado muchas cosas con array_map, pero no puedo conseguirlo para actuar sobre las teclas directamente.

¿Obtendré algún beneficio de rendimiento con el uso del mapa de matriz en lugar de utilizar un bucle foreach?

Lo que no me gusta de foreach es que no puedo actuar directamente en la matriz, y tienen que hacer frente a la creación de matrices temporales y desactivándolas:

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

Esto puede fallar si se encuentra algo escapar en la clave, agregar un nuevo elemento y mantener el elemento sin guardar.

Entonces, ¿estoy atascado con algo como esto?

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

¿Alguna otra alternativa?

+0

Esto se merece un gran viejo * ¿Por qué *? ¿Qué pasa si 'sec ($ key)' da como resultado el valor de otra clave existente? ¿Simplemente sobrescribe la clave existente? Debe explicar por qué en su aplicación una clave podría ser peligrosa. – webbiedave

+0

¿Por qué no podría ser peligroso? Puede cambiar fácilmente las claves $ _POST en formularios o con algo como Tamperdata. Algunas claves que uso en las consultas de mysql. – Ben

+0

No dije que no podrían serlo. Dije que necesita explicar por qué en * su aplicación * una clave podría ser peligrosa. Eso nos dirá cuál es el mejor enfoque para su situación. – webbiedave

Respuesta

8

Puede alguien explicarme por qué no se puede pasar una clave como referencia?

Porque el idioma no es compatible con esto. Sería difícil encontrar esta habilidad en la mayoría de los idiomas, de ahí el término clave.

¿Así que estoy atascado con algo como esto?

Sí. La mejor manera es crear una nueva matriz con las claves apropiadas.

¿Alguna otra alternativa?

La única manera de proporcionar mejores alternativas es conocer su situación específica. Si sus claves se asignan a los nombres de las columnas de la tabla, el mejor enfoque es dejar las claves tal como están y escapar de ellas en el momento de su uso en su SQL.

0

¿Por qué es un problema hacer eso? Hazlo una función. Una función toma una entrada y da una salida. La entrada de su función será su matriz "no segura". Su salida será el resultado de asegurar la matriz.

A continuación, sólo lo hacen

$where = secureMyArray($where); 

Es por eso que usted tiene la capacidad de hacer que las funciones ...

Cuestiones relacionadas