Intval和(int)输出零

时间:2017-05-26 19:43:47

标签: php arrays int

我确实搜索了stackoverflow和其他地方来解决我的问题,但没有一个能帮助我解决它。

在我的while循环中,$ myvariable的print_r()输出以下数组:

Array
 (
[1] => 0000890233330000000000000000000000000000000000000000000001b3165721010000000000
 )

Array
(
[1] => 00008a0233330000000000000000000000000000000000000000000001d5165721000000000000
)

Array
(
[1] => 00008b023333000000000000000000000000000000000000000000000109175721000000000000
)

Array
(
[1] => 00008f0233340000000000000000000000000000000000000000000001ad185721000000000000
)

Array
(
[1] => 00009002333500000000000000000000000000000000000000000000018d195721000000000000
)

我使用以下代码取出

       $id = substr($myvariable[1], 6, 8);
       $cid = hex2bin($id);
       $rid =  intval(str_replace("\0", '', $cid)); 

以较短的方式:

$rid = intval( str_replace("\0", '', hex2bin( substr($myvariable[1], 6, 8) ) ) );

我期望所有5个阵列都得到整数33,除了最后2个是34和35但是我得到零(0)。不使用intval(),没关系。我正在测试(int),我得到了相同的零(0)。所以我最终没有使用intval / (int)。虽然输出对我来说是一个真实的数字,但我真的很感激,如果你可以帮助我将这些转换为php将它们理解为真正的整数。感谢。

1 个答案:

答案 0 :(得分:2)

让我们一步一步:

$id = "02333300";
$cid = hex2bin($id);

现在$cid包含以下4个字符:

\02
3
3
\0

然后我们删除\0字符,因此它包含:

\02
3
3

当我们调用intval($cid)时,它会开始解析字符串,当它到达第一个不是数字的字符时停止。在这种情况下,这是第一个字符,因为它是\02。由于它没有读取任何数字,因此返回0

在调用intval()之前,您需要更改代码以删除所有非打印字符。

$rid = preg_replace('/[\0-\31]/', '', $cid);

应该这样做。