我有两个函数用于在深层嵌套的对象/数组组合中添加或删除斜杠。数组的第一个“级别”始终是一个对象,但它的一些属性可能是数组或对象。
以下是我的两个功能:
function objSlash( &$obj, $add=true )
{
foreach ( $obj as $key=>$field )
{
if ( is_object( $field ) )
objSlash( $field, $add );
else if ( is_array( $field ) )
arrSlash( $field, $add );
else if ( $add )
$obj->$key = addslashes( $field );
else
$obj->$key = stripslashes( $field );
}
return;
}
function arrSlash( &$arr, $add=true )
{
foreach ( $arr as $key=>$field )
{
if ( is_object( $field ) )
objSlash( $field, $add );
else if ( is_array( $field ) )
arrSlash( $field, $add );
else if ( $add )
$arr[$key] = addslashes( $field );
else
$arr[$key] = stripslashes( $field );
}
return;
}
像这样被召唤:
objSlash( $obj, false );
但是,该函数不会从嵌套数组中删除斜杠。传递给函数的对象是这样的:
stdClass Object
(
[id] => 3
[lines] => Array
(
[0] => Array
(
[character] => Name
[dialogue] => Something including \"quotes\"
)
)
)
我做错了什么?沿着这条线的某处,参考文献不见了......
答案 0 :(得分:14)
foreach
使用数组/对象的副本而不是数组/对象本身:
注意:除非数组为referenced,否则
foreach
将对指定数组的副本进行操作,而不是数组本身。foreach
对数组指针有一些副作用。在foreach
期间或之后,不要依赖数组指针而不重置它。
所以使用参考:
foreach ($arr as $key => &$field) {
// …
}
或者使用数组元素/对象属性本身,如使用$arr[$key]
而不是复制的值$field
建议的Kuroki Kaze。
答案 1 :(得分:2)
foreach
会复制价值。
尝试在objSlash( $arr[$key], $add )
内使用objSlash( $field, $add )
代替foreach
。