master

laravel/framework

Last updated at: 29/12/2023 09:25

ManagesLoops.php

TLDR

This file ManagesLoops.php is part of the Illuminate\View\Concerns namespace and contains a trait called ManagesLoops. This trait provides methods for managing loops, specifically adding loops, incrementing loop indices, popping loops from the stack, and retrieving loop information.

Methods

addLoop

This method adds a new loop to the loops stack. It takes a Countable or an array as the $data parameter. It determines the number of elements in the loop and sets various loop attributes such as iteration, index, remaining, count, first, last, odd, even, depth, and parent.

incrementLoopIndices

This method increments the indices of the top loop in the loops stack. It updates the loop attributes such as iteration, index, first, odd, even, remaining, and last.

popLoop

This method removes the top loop from the loops stack.

getLastLoop

This method returns an instance of the last loop in the loops stack as an instance of stdClass or null if the stack is empty.

getLoopStack

This method returns the entire loop stack as an array.

<?php

namespace Illuminate\View\Concerns;

use Illuminate\Support\Arr;
use Illuminate\Support\LazyCollection;

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_countable($data) && ! $data instanceof LazyCollection
                            ? 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,
            'odd' => false,
            'even' => true,
            '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,
            'odd' => ! $loop['odd'],
            'even' => ! $loop['even'],
            '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;
    }
}