В PHP есть два способа использовать массив как стек (LIFO)
и два способа использовать их как очередь (FIFO).
Можно было бы реализовать стек с push
& pop
,
но то же самое можно сделать с unshift
& shift
,
Точно так же можно реализовать очередь с push
& shift
,
но то же самое можно сделать с unshift
& pop
,
Показывать:
echo "stack push & pop approach:\n";
$s = []; array_push($s, 'first'); array_push($s, 'second'); array_push($s, 'third');
echo array_pop($s) . '-' . array_pop($s) . '-' . array_pop($s) . "\n";
echo "stack unshift & shift approach:\n";
$s = []; array_unshift($s, 'first'); array_unshift($s, 'second'); array_unshift($s, 'third');
echo array_shift($s) . '-' . array_shift($s) . '-' . array_shift($s) . "\n";
echo "queue push & shift approach:\n";
$q = []; array_push($q, 'first'); array_push($q, 'second'); array_push($q, 'third');
echo array_shift($q) . '-' . array_shift($q) . '-' . array_shift($q) . "\n";
echo "queue unshift & pop approach:\n";
$q = []; array_unshift($q, 'first'); array_unshift($q, 'second'); array_unshift($q, 'third');
echo array_pop($q) . '-' . array_pop($q) . '-' . array_pop($q) . "\n";
Какие выводы:
stack push & pop approach:
third-second-first
stack unshift & shift approach:
third-second-first
queue push & shift approach:
first-second-third
queue unshift & pop approach:
first-second-third
Так какие наборы функций использовать ?!
За стекиспользование push
& pop
(добавить в конец, взять в конец).
За очередьиспользование push
& shift
(добавить в конец, взять с начала).
При рассмотрении документации PHP на сегодня 2016-12-29 для этих функций мы находим следующее:
За array_push ():
описание упоминает «array_push () рассматривает массив как стек«
и пример использует «$stack
».
За array_pop ():
описание ничего не упоминает о стеках или очередях
и пример использует «$stack
».
За array_shift ():
описание ничего не упоминает о стеках или очередях (но упоминает о необходимости переиндексации)
и пример использует «$stack
».
За array_unshift ():
описание ничего не упоминает о стеках или очередях (но упоминает о необходимости переиндексации)
и пример использует «$queue
».
Так что это предлагает использовать push
& pop
для стеков (на основании упоминания в описании)
и предлагает использовать unshift
& pop
для очередей (на основе только упоминания очереди в примерах).
Это кажется немного тонким … Предложение по улучшению документации было представлено здесь: https://bugs.php.net/bug.php?id=73839
Запуск этого:
echo "\nstack push & pop approach : ";
$a=[];$i=0;$t=microtime(true); while($i<100000) { array_push($a, 'dummy'); array_pop($a); ++$i; }; echo (microtime(true) - $t);
echo "\nstack unshift & shift approach: ";
$a=[];$i=0;$t=microtime(true); while($i<100000) { array_unshift($a, 'dummy'); array_shift($a); ++$i; }; echo (microtime(true) - $t);
echo "\nqueue push & shift approach : ";
$a=[];$i=0;$t=microtime(true); while($i<100000) { array_push($a, 'dummy'); array_shift($a); ++$i; }; echo (microtime(true) - $t);
echo "\nqueue unshift & pop approach : ";
$a=[];$i=0;$t=microtime(true); while($i<100000) { array_unshift($a, 'dummy'); array_pop($a); ++$i; }; echo (microtime(true) - $t);
Возвращает это:
stack push & pop approach : 0.011210918426514
stack unshift & shift approach: 0.015399217605591
queue push & shift approach : 0.011627912521362
queue unshift & pop approach : 0.015273094177246
За стекс это предлагает использовать push
& pop
: естественная терминология, соответствующая упоминанию в документации, а также лучшая производительность (что имеет смысл, учитывая переиндексацию с обоими unshift
& shift
).
За очередьс это предлагает использовать push
& shift
Несмотря на упоминание в документации.
Других решений пока нет …