6

我想在 PHP 中实现一个队列,查看手册 ,我找到了这个例子:

$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue);

这将创建数组:

array('apple', 'raspberry', 'orange', 'banana');

在这种情况下,'banana' 位于队列的开头,可以使用array_pop().

我想这可能是传统方法,但是有什么好的理由不按如下方式反转数组中的数据吗?

$queue = array('apple', 'orange');
$queue[] = 'banana';//avoid function call
array_push($queue, 'strawberry', 'grape');//add multiple items
$next = array_shift($queue);

也许这是微不足道的,但这样你可以在添加单个元素时避免函数调用。还有其他一些不这样做的充分理由吗?

编辑:

看来我的问题有点难以理解,所以为了更容易看出我的方法确实根据 FIFO 原则实现了队列,我编写了这段代码来对应 PHP 手册中的示例,生成了准确的相同的数组(相反顺序除外):

$queue = array('banana', 'orange');
$queue[] = 'rasberry';
$queue[] = 'apple';

这将创建数组:

array('banana', 'orange', 'rasberry', 'apple');

这是完全相同的数据,但顺序相反,因此要检索下一个项目,您可以这样做:

$next = array_shift($queue);//The value of $next is 'banana' as before.

正如答案已经指出的那样,这与大多数人对队列的可视化方式背道而驰。似乎可读性是主要问题。但是,我发现编码更容易。对我来说,它实际上似乎更自然,因为方括号表示法[]是我的数组元素在许多情况下进入的入口。因此,实现堆栈或队列实际上并不是我如何在脑海中可视化我的数据的问题。这是一个使用什么函数来访问通过门的第一个或最后一个元素的问题。对于队列,它是array_shift(),对于堆栈,它是pop()

4

2 回答 2

2

除非您有使用第二种方法的特定有效的理由,否则我将采用第一种方法(最短的代码,最容易遵循) 。虽然$queue[] = 'banana' 可能更快(我相信它是但不确定),但差异是如此之小以至于你不应该担心它,除非你正在做数百万次操作或它实际上会产生影响的事情。

于 2013-05-28T20:09:59.407 回答
0

第一种方法和第二种方法调用之前有所不同。

array_unshift()将在数组的“顶部”添加元素(将它们读取为第一个位置)。$queue[]将广告元素放在底部。

除此之外,这两种方法都同样有效

编辑

“有什么理由不反转数据?”

是的,有:如果您想实现一个“经典”队列(将其读取为 FIFO),您必须使用第一种方法;更快,更具可读性并且不会引入“语义”错误。使用第二种方法,当您在队列底部插入一个元素时,您并没有实现 FIFO。

$queue = array("apple", "orange");
array_unshift($queue, "banana");
array_unshift($queue, 'strawberry', 'grape');

echo "First Approach<br/>";
print_r($queue);

$queue = array('apple', 'orange');
$queue[] = 'banana';//avoid function call
array_push($queue, 'strawberry', 'grape');//add multiple items
$next = array_shift($queue);

echo "Second Approach<br/>";
print_r($queue);

将产生不同的输出

First Approach
Array ( [0] => strawberry [1] => grape [2] => banana [3] => apple [4] => orange ) Second Approach
Array ( [0] => orange [1] => banana [2] => strawberry [3] => grape ) 

答案就在你面前

于 2013-05-28T20:05:24.300 回答