12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- <?php
-
- namespace Illuminate\View\Concerns;
-
- use Countable;
- use Illuminate\Support\Arr;
-
- trait ManagesLoops
- {
- /**
- * The stack of in-progress loops.
- *
- * @var array
- */
- protected $loopsStack = [];
-
- /**
- * Add new loop to the stack.
- *
- * @param \Countable|array $data
- * @return void
- */
- public function addLoop($data)
- {
- $length = is_array($data) || $data instanceof Countable ? count($data) : null;
-
- $parent = Arr::last($this->loopsStack);
-
- $this->loopsStack[] = [
- 'iteration' => 0,
- 'index' => 0,
- 'remaining' => $length ?? null,
- 'count' => $length,
- 'first' => true,
- 'last' => isset($length) ? $length == 1 : null,
- 'depth' => count($this->loopsStack) + 1,
- 'parent' => $parent ? (object) $parent : null,
- ];
- }
-
- /**
- * Increment the top loop's indices.
- *
- * @return void
- */
- public function incrementLoopIndices()
- {
- $loop = $this->loopsStack[$index = count($this->loopsStack) - 1];
-
- $this->loopsStack[$index] = array_merge($this->loopsStack[$index], [
- 'iteration' => $loop['iteration'] + 1,
- 'index' => $loop['iteration'],
- 'first' => $loop['iteration'] == 0,
- 'remaining' => isset($loop['count']) ? $loop['remaining'] - 1 : null,
- 'last' => isset($loop['count']) ? $loop['iteration'] == $loop['count'] - 1 : null,
- ]);
- }
-
- /**
- * Pop a loop from the top of the loop stack.
- *
- * @return void
- */
- public function popLoop()
- {
- array_pop($this->loopsStack);
- }
-
- /**
- * Get an instance of the last loop in the stack.
- *
- * @return \stdClass|null
- */
- public function getLastLoop()
- {
- if ($last = Arr::last($this->loopsStack)) {
- return (object) $last;
- }
- }
-
- /**
- * Get the entire loop stack.
- *
- * @return array
- */
- public function getLoopStack()
- {
- return $this->loopsStack;
- }
- }
|