[英]How can I replace every second digit to another digit using if else statement in php?
我有一個用戶將輸入表格的數字 - 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)));
如果有一種方法可以減少代碼量,我將不勝感激。 謝謝你。
一種方法是使用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
當您用另一個數字替換每個數字時,創建一個查找字符串並使用數字作為數組的索引,所有位置0-9都會被設置-即使它們是相同的值。 由於該值是一個字符串,因此您只需將值用作字符串的位置並直接替換即可。
$value = $_POST['number'];
$trans = "0516273849";
for ( $i = 1; $i < strlen($value); $i+=2 ) {
$value[$i] = $trans[$value[$i]];
}
echo $value;
編輯:
為了實現“期望的”輸出(盡管僅是對此的猜測),您可以將行更改為...
$trans = "0246813579";
$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++;
}
要現代化和完善 Nick 的正則表達式腳本,請使用\K
來消除捕獲組的使用。 箭頭 function 語法有助於使腳本更加簡潔。 (演示)
echo preg_replace_callback(
'/.\K\d/',
fn($m) => strtr($m[0], '12345678', '51627384'),
$_POST['number']
);
奈傑爾的答案針對性能進行了優化。 盡管在每次迭代時都計算字符串長度並且不必要地用相同的數字替換某些數字,但它會執行得非常快,因為它只迭代調用count()
。 因為輸入字符串和翻譯字符串中的所有字符都應該是單字節字符,所以可以通過其偏移量訪問翻譯字符串中的對應數字。 這是我的 Nigel 腳本版本(演示)
$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)
一樣神秘,但速度稍快(不明顯)。 沒有必要將每個字符轉換為 integer,使用字符串類型的翻譯源是一種更簡潔的技術。 (演示)
$number = '343608111218';
$trans = '0516273849';
foreach (str_split($number) as $i => $d) {
if ($i & 1) {
$number[$i] = $trans[$d];
}
}
echo $number;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.