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;
}
}