输入某个字符,相当于退格键(删除),输入一个删除一个,输入一个删除一个。。。
行了,废话不多说了,直接上代码:
# 方法一:这是我原本的思路,运用了递归思想
function filterStr($str,$filter){
$long = strlen($str);
$u = array();
for ($i=1; $i < $long; $i++) {
if ($str[$i] == $filter) {
$u[] = $i;
}
}
if (!empty($u)) {
/*刚开始这里用的是explode,实际操作发现不行,查手册才知道是因为explode是用一个字符串去拆分
另外一个字符串,分割字符是必填的;
而str_split才是真正的拆分字符串,直接把字符串进行分割,第二个参数是分割长度,默认是1;*/
$arr = str_split($str);
foreach ($u as $key) {
unset($arr[$key]);
unsetPrev($key-1,$arr);
}
}
return implode('', $arr);
}
# 这里用到了引用传值
function unsetPrev($k, &$arr){
if ($k >= 0) {
if (isset($arr[$k])) {
unset($arr[$k]);
}else{
unsetPrev($k-1,$arr);
}
}
return $arr;
}
# 方法二:这是经大佬点拨,运用了堆栈思想-->后进先出
function filterStr2($str,$filter){
if (is_string($str) && !empty($str)) {
$arr = str_split($str);
$newArr = array();
$filterArr = array();
foreach ($arr as $key => $value) {
if($value == $filter){
array_pop($newArr);
}else{
array_push($newArr,$value);
}
}
return implode('', $newArr);
}
}
$url = 'https://pengxb.com/';
echo $url.'<br />';
print_r(filterStr($url,'m'));
echo '<br />';
print_r(filterStr2($url,'m'));
结果
https://pengxb.com/
https://pengxb.c/
https://pengxb.c/
得到的结果是一样的,只是同样的结果,这代码量明显不一样/(ㄒoㄒ)/~~
写完之后发现自己有三个不足:
一、explode用多了,泪奔中::>_<::...
二、引用传值还是不太熟啊,第一次用错了,在调用的时候,是不需要带&符号的,丢。。。
三、要好好了解了解堆栈思想了,嗯。。。
没有难的技术,当你弄清它的原理时,你会发现原来如此简单~ 欢迎加群【536501561】讨论