2016-10-12 47 views
0

以下代碼可以正確使用提供的數組。使用array_diff錯誤輸出

$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失蹤;以及爲什麼它以逗號結尾。

有沒有辦法重寫代碼,以便正確處理數組?

+0

有沒有辦法重寫代碼,以便正確處理數組? – Benjamin

回答

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

我嘗試在值周圍使用''標記,但它不起作用。我會再試一次。 – Benjamin

0

您的前導零都使數字八進制。

+0

有沒有辦法處理八進制? – Benjamin

+0

八進制,十進制,十六進制等只是表示數字的方式,與二進制相同。我們通過將0x放在前面來呈現十六進制數字,並且通過在前面放置零來呈現八進制數字。因此,如果代碼中的值爲011,則顯式聲明的值等於十進制值9.爲什麼必須將前導零置起來?如果你需要一些列表結果,那麼我建議向字符串_output_添加前導零,但將輸入保留爲十進制。 – LordWilmore

+0

前導零來自數據庫。他們是考試編號的一部分,其結構爲 ALPHA-ALUMERIC-NUMERIC-NUMERIC-ALPHA-ALPHA – Benjamin