2013-04-06 26 views
2

我想知道SplPriorityQueue如何在優先級爲stringint時工作。簡單的例子:當優先級不是整數時,SplPriorityQueue如何工作?

$queue = new \SplPriorityQueue(); 

    $queue->insert('b', 5); 
    $queue->insert('c', 5); 
    $queue->insert('d', 1); 
    $queue->insert('a', 10); 
    $queue->insert('1', 'a'); 
    $queue->insert('2', 'b'); 

    print_r($queue); 

輸出:

Array 
(
    [5] => a 
    [4] => b 
    [3] => c 
    [2] => d 
    [1] => 2 
    [0] => 1 
) 

問題:爲什麼與int優先項都首先列出(即A B C d)?當優先級爲string(項目1 2)時,是否認爲b大於a

回答

2

這取決於SplPriorityQueue::compare()。關於它的返回值的文檔狀態:

的比較中,正整數如果的優先級爲大於 比優先級2,0,如果它們相等,否則負整數的結果。

注:

具有相同優先級的多個要素將得到離隊沒有特定的順序。

注意,這些參數優先級爲1:優先級被聲明爲mixed並沒有轉化爲int的記載。

這意味着,>通常的規則適用(see comparison operator documentation):

  • 串相比字符串:詞彙比較(數值如果兩個字符串數值)
  • INT相比INT:數值比較
  • 字符串與int相比:字符串轉換爲數字,數字比較

(int)'a'(int)'b'解析爲0,這就是爲什麼這些項目最後都是數字。

這些是你的榜樣相關的比較:

php > var_dump(1 > 'a'); 
bool(true) 
php > var_dump(1 > 'b'); 
bool(true) 
php > var_dump('b' > 'a'); 
bool(true) 
+0

好的,但如何比較用來插入到隊列時?我不明白爲什麼'a'和'b'的優先級爲0. – gremo 2013-04-06 20:41:32

+1

它用於排序。 '>'比較確定優先級*順序*。實際上,'a'和'b'沒有0的優先級,但仍然是'a'或'b'的優先級,由於上面的比較結果,它恰好小於任何數字。 – 2013-04-07 06:45:19