通过引用传递密钥和值的替代方法:

时间:2011-09-30 22:08:05

标签: php arrays recursion foreach array-map

有人可以向我解释为什么你不能传递密钥作为参考吗?

例如:

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 个答案:

答案 0 :(得分:10)

  

有人可以向我解释为什么你不能传递密钥作为参考吗?

因为该语言不支持此功能。你很难在大多数语言中找到这种能力,因此术语 key

  

所以我坚持这样的事情?

是。最好的方法是使用适当的密钥创建一个新数组。

  

任何替代方案?

提供更好选择的唯一方法是了解您的具体情况。如果您的键映射到表列名称,那么最好的方法是将键保持原样,并在SQL中使用它们时将其转义。

答案 1 :(得分:0)

为什么这样做有问题?使它成为一种功能。函数接受输入并给出输出。您的函数输入将是您的“不安全”数组。您的输出将是保护阵列的结果。

然后你就做了

$where = secureMyArray($where);

这就是为什么你有能力发挥作用......