使用array_diff输出不正确

时间:2016-10-12 15:02:01

标签: php

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

$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;以及用逗号结尾的原因。

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

2 个答案:

答案 0 :(得分: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);
}

然后差异就可以了:

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

在PHP7上测试

参考:

答案 1 :(得分:0)

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