0

我必须在一个名为 $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 变量

4

3 回答 3

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
于 2013-01-13T11:52:33.110 回答
1

有没有办法克服这个问题,还是需要重新考虑?

是的,你需要重新考虑这一点。为什么你需要这样做?只需创建一个具有三个参数的函数并将三个整数传入:

function foo($int1, $int2, $int3) {
}

您的示例使用字符串,而不是整数,因此您甚至没有遵循自己的要求。

于 2013-01-13T11:27:09.420 回答
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;
于 2013-01-13T11:42:43.913 回答