我必须在名为$ id的单个数字字符串中传递3个变量(int)。要做到这一点,我使用填充创建$ id,然后我可以爆炸来获取变量。它必须是数字,否则我会在变量之间使用下划线。我使用十一个零作为填充,因为我知道变量不会有那么多的零。所以目前我有:
$int_one = 1;
$int_two = 2;
$int_three = 3;
那将是:
$id = "1000000000002000000000003";
要创建我使用的新ID:
$id = $int_one . "00000000000" . $int_two . "00000000000" . $int_three;
并将我使用的ID分开:
$int_one = 0;
$int_two = 0;
$int_three = 0;
if (strpos($id,"00000000000") !== false) {
$id = strrev($id); // Reversed so 0's in int's don't get counted
$id = explode("00000000000", $id);
// Set numbers back the right way
$int_one = strrev($id[2]);
$int_two = strrev($id[1]);
$int_three = strrev($id[0]);
}
当个别变量为0时会遇到问题。有没有办法克服这个问题或是否需要重新考虑?
编辑: $id
应该是一个不是int的数字字符串
需要处理0到2147483647之间的int变量
答案 0 :(得分:2)
您可以使用一些字符串魔法来确保连续数字中没有多个零,并使用“00”分隔值。这会生成数字字符串,无论整数的大小或组成如何,都可以对其进行唯一解码。
$a = 100;
$b = 0;
$c = 120;
// Encode;
$id = str_replace('0', '01', $a).'00'
.str_replace('0', '01', $b).'00'
.str_replace('0', '01', $c);
// $id = "101010001001201"
// Decode;
$tmp = split('00', $id);
$a2 = intval(str_replace('01', '0', $tmp[0]));
$b2 = intval(str_replace('01', '0', $tmp[1]));
$c2 = intval(str_replace('01', '0', $tmp[2]));
// $a2 = 100, $b2 = 0, $c2 = 120
答案 1 :(得分:1)
有没有办法克服这一点,还是需要重新思考?
是的,你需要重新考虑一下。你为什么要那样做呢?只需创建一个包含三个参数的函数,并将三个整数传递给:
function foo($int1, $int2, $int3) {
}
您的示例使用字符串,而不是使用整数,因此您甚至不遵循自己的要求。
答案 2 :(得分:0)
你可以尝试这种方法:
$int_one = 1;
$int_two = 2;
$int_three = 3;
$id = $int_one * 1000000000000 + $int_two * 1000000 + $int_three;
// This will create a value of 1000002000003
要扭转这个过程:
// Get the modulo of $id / 1000000 --> 3
$int_three = $id % 1000000;
// Recalculate the base id - if you would like to retain the original id, first duplicate variable
// This would make $id = 1000002;
$id = ($id - $int_three) / 1000000;
// Again, get modulo --> 2
$int_two = $id % 1000000;
// Recalculate base id
$id = ($id - $int_two) / 1000000;
// Your first integer is the result of this division.
$int_one = $id;