You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何直接从数组创建PHP的SplStack?

如何直接从数组创建PHP的SplStack?

嘿,这个问题我之前也纠结过!其实不用自己写循环push的函数,SplStack的父类SplDoublyLinkedList提供了addAll方法可以批量添加元素,不过要注意栈的顺序问题——因为SplStack默认是**后进先出(LIFO)**的模式,直接用addAll会和你循环push的结果顺序相反,我给你两种靠谱的解决办法:

  • 方法一:反转数组后批量添加
    因为addAll是把元素依次加到链表的尾部,而SplStack的push是把元素加到链表头部,所以先反转数组,再用addAll就能得到和循环push完全一致的栈:

    $array = [1, 2, 3];
    $stack = new SplStack();
    $stack->addAll(array_reverse($array));
    
    // 测试一下,pop出来的顺序是3、2、1,和循环push的结果一样
    echo $stack->pop(); // 输出3
    echo $stack->pop(); // 输出2
    echo $stack->pop(); // 输出1
    
  • 方法二:临时切换迭代模式
    先把SplStack临时切换成队列(FIFO)模式,用addAll添加数组后再切回栈模式,这样也能保证顺序正确:

    $array = [1, 2, 3];
    $stack = new SplStack();
    
    // 临时切换为FIFO队列模式
    $stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP);
    $stack->addAll($array);
    // 切回LIFO栈模式
    $stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP);
    
    // 同样,pop出来的顺序是3、2、1
    echo $stack->pop(); // 输出3
    

如果你完全不在乎栈内元素的顺序,那直接调用$stack->addAll($array)也可以,但大多数场景下顺序都是重要的,所以上面两种方法更实用。

备注:内容来源于stack exchange,提问作者wujido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 06:59:05