2012-08-17 129 views
10

這是一個很簡單的問題,但PHP文檔並沒有解釋它爲什麼會發生。PHP array_diff奇怪

我有這樣的代碼:

var_dump($newattributes); var_dump($oldattributes); 
var_dump(array_diff($newattributes, $oldattributes)); 

對於briefity我將省略我實際使用(因爲每個是117個元件長)並切割成的情況下的結構的大部分地區。

我已經一個陣列稱爲$newattributes它看起來像:

array(117){ 
    // Lots of other attributes here 
    ["deleted"] => int(1) 
} 

而另一個名爲$oldattributes它看起來像:

array(117){ 
    // Lots of other attributes here 
    ["deleted"] => string(1) "0" 
} 

它看起來不同吧?根據array_diff:沒有。我從array_diff得到的輸出是:

​​

我已閱讀文檔頁面但是它說:

兩個因素被認爲是平等的,當且僅當(字符串)$ elem1 === (字符串)$ elem2。用詞表示:當字符串表示是相同的。

而我不知道「1」如何反對等於「0」。

所以我看到一些警告array_diff我沒有考慮到?

+3

好問題清楚,問得好,不要太長,代碼太多。更多的人應該這樣做! +1 – Hidde 2012-08-17 10:41:34

+2

這不應該發生,事實上[它不適合我](http://ideone.com/jDeUd)。 – Jon 2012-08-17 10:42:51

+0

@Jon感謝您的測試,我會更多地關注我的PHP構建 – Sammaye 2012-08-17 10:47:37

回答

11

可能駐留在事實上,你正在使用關聯數組的問題:你應該嘗試使用下面的關聯數組:array_diff_assoc()

<?php 
    $newattributes = array(
     "deleted" => 1 
    ); 

    $oldattributes = array(
     "deleted" => "0" 
    ); 

    $result = array_diff_assoc($newattributes, $oldattributes); 

    var_dump($result); 
?> 

結果:

array(1) { 
     ["deleted"]=> 
     int(1) 
    } 
+0

是的工作,哇,這只是瘋了 – Sammaye 2012-08-17 10:56:00

+0

歡迎您:) PHP是一種非常寬容的語言,知道正確的功能有時通常是正確的把戲。 – DonSeba 2012-08-17 10:57:08

+0

+1。你有很棒的精神狀態。關聯數組! – Karma 2012-08-17 11:02:21

2

發生在我身上太(當有更多的價值比一個)

$new = array('test' => true, 'bla' => 'test' 'deleted' => 1); 
$old = array('test' => true, 'deleted' => '0'); 

對於和array_diff你需要做一些額外的工作,因爲在默認情況下它返回一個relative complement

試試這個:

array_diff(array_merge($new, $old), array_intersect($new, $old)) 

結果:

Array 
(
    [bla] => test 
    [deleted] => 0 
) 
+0

事實上,這是有用的感謝,我採取了另一個答案作爲標記的一個,因爲它不需要合併或相交,但+1是第一次一個工作和支持數學,這是prolly什麼時候比較聯想 – Sammaye 2012-08-17 10:58:45

+0

做什麼PHP的做法是一樣的:array_diff_assoc()。很棒的發現雖然:) +1 – DonSeba 2012-08-17 10:59:13

+0

Yeahh,'array_diff_assoc'顯然更容易,不知道。 SO是學習額外東西的好工具:) – 2012-08-17 11:54:31