Массивы как очереди в PHP

Я хочу реализовать очередь в PHP, и, посмотрев руководство, я нашел этот пример:

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

Это создает массив:

array('apple', 'raspberry', 'orange', '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(),

2 ответа

Решение

Я бы сделал это первым способом (самый короткий код, самый простой для подражания), если у вас нет конкретной и веской причины для использования второго подхода. В то время как $queue[] = 'banana' может быть быстрее (я верю, что это так, но не знаю наверняка), разница настолько мала, что вам не стоит об этом беспокоиться, если вы не выполняете миллионы операций или что-то такое, что могло бы изменить ситуацию.

Существует разница перед первым подходом и вторым - отдельным вызовом функции.

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 ) 

ответ здесь перед вами

Другие вопросы по тегам