Search code examples
phpspl

How to create PHP SplStack from array


I'm wondering if there is an easy way to create SplStack from an array. Sure I can write a simple function that will do that:

function stackFromArray(array $array): SplStack
{
    $stack = new SplStack();
    foreach ($array as $item) {
        $stack->push($item);
    }

    return $stack;
}

However, I don't like this approach, because I have to iterate over the array and push items one by one. Is there a way to create a stack directly from the array?


Solution

  • The documentation doesn't suggest any method to use, nor does it specify that the constructor can be used through the SplDoublyLinkedList.

    Since, really, all the SplStack is just a SplDoublyLinkedList wrapper, you could easily create a Facade to achieve this.

    Create a simple interface for future extendability and testability:

    interface SplStackFacadeInterface
    { 
        public static function fromArray(array $arr);
    }
    

    Extend the SplStack functionality for coupling.

    class SplStackFacade extends SplStack implements SplStackFacadeInterface
    {
        public static function fromArray(array $arr): SplStack
        {
            $splStack = new self();
            array_map([$splStack, 'push'], $arr);
            return $splStack;
        }
    }
    

    Then just use it like so:

    $stack = SplStackFacade::fromArray([1, 2, 3, 4]);
    

    See it working over at 3v4l.org