用遞迴addslashes函數轉義數組

來源:互聯網
上載者:User
有個一個數組,可能是多維的,裡面有些值帶有特殊符號 比如“ 我用遞迴加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)
}

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.