有個一個數組,可能是多維的,裡面有些值帶有特殊符號 比如“ 我用遞迴加addslashes()轉義
沒有達到效果 幫忙看看哪錯了
$arr=array('ii"',array('one'=>'ec"','two'=>5));
function t(&$arr){
foreach($arr as $v){
if(is_string($v)){
$arr[]=addslashes($v);
}else{
t($v);
}
}
}
t($arr);
echo "
";
print_r($arr);
echo '
';
前台頁面是這麼輸出的
________________________________________________________
Warning: Invalid argument supplied for foreach() in D:\AppServ\www\index.php on line 22
Array
(
[0] => ii"
[1] => Array
(
[one] => ec"
[two] => 5
)
[2] => ii\"
[3] => ii\\\"
)
回複討論(解決方案)
你自己對比下
$arr=array('ii"',array('one'=>'ec"','two'=>5),'aa"a');function t(& $arr){ foreach($arr as $k => $v){ if(is_string($v)){ $arr[$k] = addslashes($v); }else{ $arr[$k] = t($v); } } return $arr;}t($arr);echo "";print_r($arr);echo '
';
可以用 FILTER
$arr = array('ii"',array('one'=>"ec'",'two'=>5));array_walk_recursive($arr, function(&$v) { $v = addslashes($v);} );print_r($arr);
Array( [0] => ii\" [1] => Array ( [one] => ec\' [two] => 5 ))
你的代碼要這樣改
$arr=array('ii"',array('one'=>'ec"','two'=>5));function t(&$arr){ foreach($arr as $i=>&$v){ if(is_array($v)){ t($v); }else{ $arr[$i] = addslashes($v); } }}t($arr);print_r($arr);
改成??就可以了。
function t(&$arr){foreach($arr as $key=>$v){if(is_string($v)){$arr[$key]=addslashes($v);}else{t($arr[$key]);}}}
我比較喜歡搗亂
function t(&$arr){ foreach($arr as $key=>$v){ if(is_string($v)){ $arr[$key]=addslashes($v); }else{ t($arr[$key]); } }}$arr=array('ii"',array('one'=>'ec"','two'=>5));t($arr);Invalid argument supplied for foreach()
改成??就可以了。
function t(&$arr){foreach($arr as $key=>$v){if(is_string($v)){$arr[$key]=addslashes($v);}else{t($arr[$key]);}}}
再改一下。
function t(&$arr){ foreach($arr as $key=>$v){ if(is_array($v)){ t($arr[$key]); }else{ $arr[$key]=addslashes($v);} }} $arr=array('ii"',array('one'=>'ec"','two'=>'5'));t($arr);print_r($arr);
謝謝樓上幾位大神的耐心解答,你們提供的答案都正確,但是並沒有指出我的問題所在。我看了一天的代碼,終於發現我寫的代碼問題所在:報錯的原因是,$arr=array('ii"',array('one'=>'ec"','two'=>5));我提供的參數進入到函數體內後最有'two'=>5遞迴到foreach不是一個數組,所以報為foreach提供了無效參數的警告
$arr=array('ii"',array('one'=>'ec"','two'=>5));
function t(&$arr){
foreach($arr as $v){
if(is_string($v)){
$arr[]=addslashes($v); //這裡如果用$arr[]只能是在原數組情況下添加了元素
}else{
t( $v); //這裡$v列印出來是array('one'=>'ec"','two'=>5) 當它遞迴重新走到foreach裡面已經不是$arr原數組了,是和$arr完全不相關的一個新數組
}
}
}
如下面的寫就ok啦!
$arr=array('ii"',array('one'=>'ec"','two'=>5));
function t(&$arr){
foreach($arr as $k=>$v){
if(is_string($v)){
$arr[$k]=addslashes($v);
}else{
if( is_array($v)){ //加上判斷後就可以關閉為foreach提供了無效參數的警告
t( $arr[$k]); //這裡指的是原數組foreach出來的array('one'=>'ec"','two'=>5)
}