2

我想知道SplPriorityQueue当优先级为stringor时如何工作int。快速示例:

    $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优先列出优先项(即abcd)?当优先级为string(项目 1 2)时,被b认为大于a

4

1 回答 1

2

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

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

笔记:

具有相同优先级的多个元素将不按特定顺序出队。

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

这意味着,应用的通常规则>请参阅比较运算符文档):

  • 字符串与字符串比较:词法比较(如果两个字符串都是数字,则为数字)
  • int 与 int 比较:数值比较
  • string 与 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)
于 2013-04-06T17:10:28.407 回答