見如下代碼
$data = array('or','my','you','which','love');
$arr = array('l'=>'k','w'=>'q','e'=>'r','t'=>'y','m'=>5);
foreach ($data as $k => $v) {
foreach ($arr as $key => $value) {
$pattern = $key;
$replacment = $value;
$data[$k] = str_replace($pattern,$replacment,$v);//無法替換??
// $data[$k] = str_replace(array_keys($arr),$arr,$v);
// $data[$k] = str_replace('l','k',$v);
}
}
var_dump($data);
?>
回複討論(解決方案)
不知道樓主說的替換指的是不是把data裡面每個字串中出現過的字元都去arr裡面去匹配下,有的換就替換。如果是這樣的話 直接這樣寫就可以了:
$data[$k] = str_replace($pattern,$replacment,$v);
這句裡面$v重新複製了,換成$data[$k]
$data[$k] = str_replace($pattern,$replacment,$data[$k]);
謝謝,我知道這樣子寫可以做到替換的效果,但是我的疑惑是為什麼上面用foreach替換為什麼不行呢?錯在哪兒了呢。。
$data[$k] = str_replace($pattern,$replacment,$v);
$data[$k] 被迴圈的賦值,取最後一次賦值的結果.
謝謝,我知道這樣子寫可以做到替換的效果,但是我的疑惑是為什麼上面用foreach替換為什麼不行呢?錯在哪兒了呢。。
你在迴圈中把$pattern $replacement $data[$k]都列印出來看看 應該就比較清晰了
0 orororororor1 mymymymymy5y2 youyouyouyouyouyou3 whichwhichqhichwhichwhichwhich4 lovekovelovelovrlovelove
樓主這是我列印出來的迴圈結果,其實在foreach中。str_replace已經生效,但是被後面的替換了,所以你才覺得沒有替換
foreach ($data as $k => $v) {
中的 $v 是 $data[$k] 的副本
在內層迴圈中
$data[$k] = str_replace($pattern,$replacment, $v);
$v 並沒有改變,所以所有的替換都是對未經處理資料,而不是對上次替換結果的
如果你寫作
foreach ($data as $k => &$v) {
就可以看到,的確是起作用了