在php中如何使用if else语句将每隔一个数字替换为另一个数字?

sgtfey8w  于 2023-01-19  发布在  PHP
关注(0)|答案(4)|浏览(123)

我有一个数字,用户将把它放入一个表单中- 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)));

如果有一种方法,我可以减少代码量,我将非常感激。谢谢。

cigdeys3

cigdeys31#

一种方法是使用preg_replace_callback,传递一行中的2个数字的匹配,并使用strtr适当地替换第二个数字:

$_POST['number'] = '343608111218';

echo preg_replace_callback('~(\d)(\d)~', function ($m) {
    return $m[1] . strtr($m[2], '12345678', '51627384');
}, $_POST['number']);

输出:

323304151114

这是基于你对如何进行替换的描述,但是如果你的期望输出反映了正确的替换方式,那么替换必须是相反的,这只是一个将参数的顺序改为strtr的问题:

echo preg_replace_callback('~(\d)(\d)~', function ($m) {
    return $m[1] . strtr($m[2], '51627384', '12345678');
}, $_POST['number']);

输出:

383307121417

Demo on 3v4l.org

waxmsbnn

waxmsbnn2#

当您用另一个数字替换每个数字时,创建一个查找字符串并使用数字作为数组的索引,所有位置0 - 9都被设置-即使它们是相同的值。由于值是字符串,您可以只使用值作为字符串的位置并直接替换它。

$value = $_POST['number'];
$trans = "0516273849";
for ( $i = 1; $i < strlen($value); $i+=2 )  {
    $value[$i] = $trans[$value[$i]];
}
echo $value;
    • 编辑:**

要实现什么是"所需的"输出(尽管只是猜测这应该是什么),您可以将该行更改为...

$trans = "0246813579";
mi7gmzs6

mi7gmzs63#

$transform = array(
    0 => 0,
    1 => 5,
    2 => 1,
    3 => 6,
    4 => 8,
    5 => 7,
    6 => 3,
    7 => 8,
    8 => 4,
    9 => 9
);
$number = '343608111218';
$num = array_map('intval', str_split($number));
$i = 1;
foreach ($num as $key => $value) {

    if (0 == ($i % 2)) {
        echo $transform[$value];
    } else {
        echo $value;
    }
    $i++;
}
zynd9foi

zynd9foi4#

要使Nick的正则表达式脚本现代化并对其进行优化,请使用\K来消除捕获组的使用。箭头函数语法有助于使脚本更简洁。(Demo

echo preg_replace_callback(
         '/.\K\d/',
         fn($m) => strtr($m[0], '12345678', '51627384'),
         $_POST['number']
     );

奈杰尔的答案在性能上进行了优化,尽管每次迭代都要计算字符串长度,而且不必要地用相同的数字替换某些数字,但它的执行速度非常快,因为它只对count()进行迭代调用,因为输入字符串和翻译字符串中的所有字符都应该是单字节字符,翻译字符串中对应的数字可以通过它的偏移量来访问。下面是奈杰尔脚本的我的版本(Demo

$value = '343608111218';
$trans = '0516273849';

for ($i = 1, $len = strlen($value); $i < $len; $i += 2) {
    $value[$i] = $trans[$value[$i]];
}
echo $value;

Mujuonly的答案可以进一步简化。$var & 1是一种按位的奇数校验,它和!($var % 2)一样神秘,但是稍微快一些(不明显)。没有必要将每个字符转换为整数,使用字符串类型的转换源是一种更简洁的技术。

$number = '343608111218';
$trans = '0516273849';

foreach (str_split($number) as $i => $d) {
    if ($i & 1) {
        $number[$i] = $trans[$d];
    }
}
echo $number;

相关问题