PHP:1个int变量中的3个ID

时间:2013-01-13 11:24:55

标签: php

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

3 个答案:

答案 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;