当整数值用零填充时,使用 array_diff() 的输出不正确

问题描述 投票:0回答:2

以下代码适用于提供的数组。

$arr1 = array(1,2,4,6,7,9,13,15); 

$arr2 = range(1,max($arr1));                                                    

$missing = array_diff($arr2,$arr1); 

foreach ($missing as $key => $val) {
    echo $val;
    echo ",";
}

但是如果我将 $arr1 更改为包含 001,002,004,006,007,009,013,015,则会给出以下输出:003,005,008,009,010,012,

我通过将其放入 foreach 循环来格式化输出:

$val = str_pad($val, 3, "0", STR_PAD_LEFT); 

我不明白为什么它宣布009失踪;为什么不声明011和014失踪;以及为什么它以逗号结尾。

有没有办法重写代码以便正确处理数组?

php arrays filter octal array-difference
2个回答
2
投票

这是因为以0开头的数字是八进制数:

http://php.net/manual/pl/language.types.integer.php

要解决此问题,您可以将值作为字符串存储在原始数组中:

$arr = ['001', '002', '005', '011', '007'];

然后

echo max($arr); //011

仍然找到正确的,所以现在只需:

for ($i=1; $i<=ltrim(max($arr), '0'); $i++) {
    $newArr[] = str_pad($i, 3, '0', STR_PAD_LEFT);
}

然后差异就OK了:

print_r(array_diff($newArr, $arr));
Array
(
    [2] => 003
    [3] => 004
    [5] => 006
    [7] => 008
    [8] => 009
    [9] => 010
)

在 PHP7 上测试

参考:


0
投票

您的前导零使数字变成八进制。

© www.soinside.com 2019 - 2024. All rights reserved.