Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
<?php

namespace PhpOffice\PhpSpreadsheet\Calculation\Token;

use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
> use PhpOffice\PhpSpreadsheet\Calculation\Engine\BranchPruner;
class Stack { /**
> * @var BranchPruner * The parser stack for formulae. > */ * > private $branchPruner; * @var mixed[] > */ > /**
private $stack = []; /** * Count of entries in the parser stack. * * @var int */ private $count = 0;
> public function __construct(BranchPruner $branchPruner) /** > { * Return the number of entries on the stack. > $this->branchPruner = $branchPruner; * > } * @return int >
< * < * @return int
< public function count()
> public function count(): int
return $this->count; } /** * Push a new entry onto the stack. *
< * @param mixed $type
* @param mixed $value
< * @param mixed $reference < * @param null|string $storeKey will store the result under this alias < * @param null|string $onlyIf will only run computation if the matching < * store key is true < * @param null|string $onlyIfNot will only run computation if the matching < * store key is false < */ < public function push( < $type, < $value, < $reference = null, < $storeKey = null, < $onlyIf = null, < $onlyIfNot = null < ): void { < $stackItem = $this->getStackItem($type, $value, $reference, $storeKey, $onlyIf, $onlyIfNot); <
> */ > public function push(string $type, $value, ?string $reference = null): void > { > $stackItem = $this->getStackItem($type, $value, $reference);
$this->stack[$this->count++] = $stackItem; if ($type == 'Function') { $localeFunction = Calculation::localeFunc($value); if ($localeFunction != $value) { $this->stack[($this->count - 1)]['localeValue'] = $localeFunction; } } }
< public function getStackItem( < $type, < $value, < $reference = null, < $storeKey = null, < $onlyIf = null, < $onlyIfNot = null < ) {
> public function pushStackItem(array $stackItem): void > { > $this->stack[$this->count++] = $stackItem; > } > > /** > * @param mixed $value > */ > public function getStackItem(string $type, $value, ?string $reference = null): array > {
$stackItem = [ 'type' => $type, 'value' => $value, 'reference' => $reference, ];
< if (isset($storeKey)) {
> // will store the result under this alias > $storeKey = $this->branchPruner->currentCondition(); > if (isset($storeKey) || $reference === 'NULL') {
$stackItem['storeKey'] = $storeKey; }
< if (isset($onlyIf)) {
> // will only run computation if the matching store key is true > $onlyIf = $this->branchPruner->currentOnlyIf(); > if (isset($onlyIf) || $reference === 'NULL') {
$stackItem['onlyIf'] = $onlyIf; }
< if (isset($onlyIfNot)) {
> // will only run computation if the matching store key is false > $onlyIfNot = $this->branchPruner->currentOnlyIfNot(); > if (isset($onlyIfNot) || $reference === 'NULL') {
$stackItem['onlyIfNot'] = $onlyIfNot; } return $stackItem; } /** * Pop the last entry from the stack.
< * < * @return mixed
*/
< public function pop()
> public function pop(): ?array
{ if ($this->count > 0) { return $this->stack[--$this->count]; } return null; } /** * Return an entry from the stack without removing it.
< * < * @param int $n number indicating how far back in the stack we want to look < * < * @return mixed
*/
< public function last($n = 1)
> public function last(int $n = 1): ?array
{ if ($this->count - $n < 0) { return null; } return $this->stack[$this->count - $n]; } /** * Clear the stack. */ public function clear(): void { $this->stack = []; $this->count = 0;
< } < < public function __toString() < { < $str = 'Stack: '; < foreach ($this->stack as $index => $item) { < if ($index > $this->count - 1) { < break; < } < $value = $item['value'] ?? 'no value'; < while (is_array($value)) { < $value = array_pop($value); < } < $str .= $value . ' |> '; < } < < return $str;
} }