当优先级不是整数时,SplPriorityQueue如何工作?

时间:2013-04-06 13:48:16

标签: php spl

我想知道SplPriorityQueue在优先级为stringint时的工作原理。快速举例:

    $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优先级的项目(即b c d)?当优先级为string(第1项)时,b是否被视为大于a

1 个答案:

答案 0 :(得分:2)

这由SplPriorityQueue::compare()确定。文档说明了它的返回值:

  

比较结果,如果 priority1 更大,则为正整数   比 priority2 ,如果相等则为0,否则为负整数。

     
    

注意:

         

具有相同优先级的多个元素将以无特定顺序出列。

  

请注意,参数 priority1 priority2 被声明为mixed,并且没有提到转换为int。

这意味着>的通常规则适用(see comparison operator documentation):

  • 字符串与字符串比较:词法比较(如果两个字符串都是数字,则为数字)
  • int与int相比:数字比较
  • 字符串与int相比:string转换为数字,数字比较

(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)