我有一个数字,用户将把它放入一个表单中- 12位数字。每隔一位数字需要替换-如果该数字是:1,然后变成5,2,然后变成1,3,然后变成6,4,然后变成2,5,然后变成7,6,然后变成3,7,然后变成8,8,然后变成4,0和9保持不变。
例如:343608111218最终会变成383307121417。
这是我目前正在做的一个例子,但我认为它是冗长的。这只是第一个数字,所以我假设我可以做别的事情?
$_POST['number'] = '343608111218';
preg_match_all('~(\d)~', $_POST['number'], $pregs);
if($pregs[1][1] === "1") {
$one = 5;
}
elseif ($pregs[1][1] === "2"){
$one = 1;
}
elseif ($pregs[1][1] === "3"){
$one = 6;
}
elseif ($pregs[1][1] === "4"){
$one = 2;
}
elseif ($pregs[1][1] === "5"){
$one = 7;
}
elseif ($pregs[1][1] === "6"){
$one = 3;
}
elseif ($pregs[1][1] === "7"){
$one = 8;
}
elseif ($pregs[1][1] === "8"){
$one = 4;
}
$rep1 = (array_replace($pregs[1],array(1=>$one)));
如果有一种方法,我可以减少代码量,我将非常感激。谢谢。
4条答案
按热度按时间cigdeys31#
一种方法是使用
preg_replace_callback
,传递一行中的2个数字的匹配,并使用strtr
适当地替换第二个数字:输出:
这是基于你对如何进行替换的描述,但是如果你的期望输出反映了正确的替换方式,那么替换必须是相反的,这只是一个将参数的顺序改为
strtr
的问题:输出:
Demo on 3v4l.org
waxmsbnn2#
当您用另一个数字替换每个数字时,创建一个查找字符串并使用数字作为数组的索引,所有位置0 - 9都被设置-即使它们是相同的值。由于值是字符串,您可以只使用值作为字符串的位置并直接替换它。
要实现什么是"所需的"输出(尽管只是猜测这应该是什么),您可以将该行更改为...
mi7gmzs63#
zynd9foi4#
要使Nick的正则表达式脚本现代化并对其进行优化,请使用
\K
来消除捕获组的使用。箭头函数语法有助于使脚本更简洁。(Demo)奈杰尔的答案在性能上进行了优化,尽管每次迭代都要计算字符串长度,而且不必要地用相同的数字替换某些数字,但它的执行速度非常快,因为它只对
count()
进行迭代调用,因为输入字符串和翻译字符串中的所有字符都应该是单字节字符,翻译字符串中对应的数字可以通过它的偏移量来访问。下面是奈杰尔脚本的我的版本(Demo)Mujuonly的答案可以进一步简化。
$var & 1
是一种按位的奇数校验,它和!($var % 2)
一样神秘,但是稍微快一些(不明显)。没有必要将每个字符转换为整数,使用字符串类型的转换源是一种更简洁的技术。