關於array_udiff_assoc和array_intersect_ukey的問題?

來源:互聯網
上載者:User

在家沒事背背函數,出現了以下問題?求助!謝謝~

不好意思!我還想請教一下:

function k($k1,$k2){    if($k1>$k2){        return 1;    }elseif($k1<$k2){        return -1;    }else{        return 0;    }}function v($v1,$v2){    if($v1>$v2){        return -1;    }elseif($v1<$v2){        return 0;    }else{        return 0;    }}$a = array(0=>"Cat",1=>"Dog",2=>"Horse");$b = array(2=>"Bird",3=>"Rat",4=>"Fish");print_r(array_udiff_uassoc($a,$b,'k','v'));

以上這個例子:
健名和健值同時使用兩個不同的回呼函數,一個正值是1,一個正值是0
正值或負值才會輸出或返回,0則不會輸出。
我把key設定正值是應該輸出的,同時它的val設定為0它就不會輸出了。
它們不會衝突嗎? 這又應該咋麼去解釋呢?
還有字串是如何比叫大於和小於的?是按位元組算的嗎?謝謝了!

回複內容:

在家沒事背背函數,出現了以下問題?求助!謝謝~

不好意思!我還想請教一下:

function k($k1,$k2){    if($k1>$k2){        return 1;    }elseif($k1<$k2){        return -1;    }else{        return 0;    }}function v($v1,$v2){    if($v1>$v2){        return -1;    }elseif($v1<$v2){        return 0;    }else{        return 0;    }}$a = array(0=>"Cat",1=>"Dog",2=>"Horse");$b = array(2=>"Bird",3=>"Rat",4=>"Fish");print_r(array_udiff_uassoc($a,$b,'k','v'));

以上這個例子:
健名和健值同時使用兩個不同的回呼函數,一個正值是1,一個正值是0
正值或負值才會輸出或返回,0則不會輸出。
我把key設定正值是應該輸出的,同時它的val設定為0它就不會輸出了。
它們不會衝突嗎? 這又應該咋麼去解釋呢?
還有字串是如何比叫大於和小於的?是按位元組算的嗎?謝謝了!

1) array_udiff_assoc和array_diff_uassoc真的可以作為別名使用嗎? @怡紅公子 抱歉,你貌似把代碼裡面的兩個函數名看錯了。不過不得不吐槽題主直接拿貼代碼啊,想測試答題的人還須有再敲一遍...

不能,能做別名的話php手冊上就說明了。類似array_diff_assoc命名的函數有4個,其中u都是標示是否接受使用者傳入回呼函數的意思。diff表示對數組值進行比較,assoc表示是否同時也比較索引值(即key和value都相同才認為相同)。diff前面有u表示支援使用者傳入數組值的自訂比較函數,assoc前面有u表示支援使用者傳入數組建值的自訂比較函數。

你輸出的結果相同只是因為你的處理結果卻是正好相同而已,我們判斷函數別名不能根據輸出結果來判斷的。array_udiff_assoc回調傳給All函數的$v1、$v2是數組的值(green,grown...);而array_diff_uassoc回調傳給All函數的$v1、$v2是數組的索引值(a、b、c...)。

2) array_intersect_key和array_intersect_ukey都是查詢有交叉索引值並返回的,區別是後者使用自訂的回呼函數。

如 @怡紅公子 所說,返回不同卻是是因為你把回呼函數寫錯了。那麼為什麼錯了呢?簡單的說,因為PHP底層在做比較的時候,先會分別對兩個數組的keys進行一次快速排序,那麼如果第一組keys裡面的第3個值已經大於第二組keys裡面的第2個值(回呼函數return 1;表示大於),那麼接下來進行第一組第4個值的比較時,就直接略過第二組的前2個值了。為了提高效率,這就是為什麼回呼函數須有返回-1、0、1三個不同的值的原因了。

開篇先吐槽,騷年沒事要好好的看看手冊啊。

array_diff_assocarray_udiff_assoc

看錯函數了,應該是array_diff_uassocarray_udiff_assoc的區別,如 @samoay 所講,就是一個是比較鍵,一個是比較值的。這個在手冊的中文描述中確實看不大出來,不過看樣本就非常清楚了。如果要知道詳細的,可以看 @samoay 的答案。

----------我是錯誤答案分割線----------

這兩個明顯是不同的函數,最大的區別是array_udiff_assoc可以使用第三個參數來自訂對比的方式。而array_diff_assoc是沒有這個回呼函數的參數的,你的樣本中明顯使用錯了。引用官方手冊的話的話是這麼說的:

array_udiff_assoc() 返回一個數組,該數組包括了所有在 array1 中但是不在任何其它參數數組中的值。注意和 array_diff() 與 array_udiff() 不同的是鍵名也用於比較。數組資料的比較是用使用者提供的回呼函數進行的。在此方面和 array_diff_assoc() 的行為正好相反,後者是用內建函式進行比較的。 —— array_udiff_assoc

要說這裡得出的結果一致的問題,只能說這是因為你寫的回呼函數剛好和系統內建的判別方式結果相同罷了,不能說明兩個函數就是一個函數。同類型的函數也有很多,例如sortusort
----------錯誤答案結束----------

array_intersect_keyarray_intersect_ukey

這裡就更需要吐槽一下你了,之所以你的array_intersect_ukey沒有返回結果的原因很簡單,是你的Keys函數沒有寫對好麼。請看看官方手冊怎麼說的:

key_compare_func
在第一個參數小於,等於或大於第二個參數時,該比較函數必須相應地返回一個小於,等於或大於 0 的整數。
—— array_intersect_ukey

看清楚,需要分別返回三個整數值好麼,和array_udiff_assoc是不一樣的,不要隨便套用。實際測試了,如果返回正確的值的話是正常的,下面是我測試的範例程式碼:

'DOG',    1=>'CAT',    2=>'HORSE'    );$b = array(    3=>'RAT',    1=>'BIRD',    5=>'MONKEY'    );function keys($k1, $k2) {    if($k1 > $k2)         return 1;    else if($k1 < $k2)        return -1;    else         return 0;}print_r(array_intersect_key($a, $b));print_r(array_intersect_ukey($a, $b, "keys"));//返回 Array ( [1] => CAT ) Array ( [1] => CAT )
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.