繁体   English   中英

splstack推送并添加

[英]splstack push and add

如果我们一起使用推和加法,如何计算堆栈

$stack = new SplStack();
$stack[] = 'one2';
$stack[] = 20152;
$stack[] = 'two2';

echo "<pre>";
print_r($stack);

$stack->add(0, 'one');
$stack->add(1, 'two');
$stack->add(2, '2015');


echo "<pre>";
print_r($stack);

我在结果中看到了这一点,但无法确定第二部分。

第一个print_r的结果:

SplStack Object
(
    [flags:SplDoublyLinkedList:private] => 6
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => one2
            [1] => 20152
            [2] => two2
        )
)

第二个print_r的结果:

SplStack Object
(
    [flags:SplDoublyLinkedList:private] => 6
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => one2
            [1] => 20152
            [2] => 2015
            [3] => two
            [4] => one
            [5] => two2
        )
)

我也花了一些时间来解决这个问题,但是这种行为是正确的。 最好使用列表索引而不是内部数组的print_r查看列表。 此代码将执行以下操作:

for ($i = 0; $i < $stack->count(); $i++) {
    echo "index $i contains " . $stack->offsetGet($i) . "\n";
}

请注意,索引0代表列表的顶部(即$stack->pop()将返回的内容)。 这是您的初始代码块之后的样子:

index 0 contains two2
index 1 contains 20152
index 2 contains one2

这是因为$stack[] = x等效于$stack->push(x)

现在查看下一个代码块:

$stack->add(0, 'one');

如果我们看一下add手册 ,它会说:

在指定的索引处插入值newval,将该索引处的先前值(和所有后续值)重新排列到列表中。

由于列表的顶部是索引0,因此必须将添加项中的值插入索引1,以便可以将“索引0”中的现有值“改组为列表”,即必须保留在索引0处。执行此代码后,列表的转储将显示以下内容:

index 0 contains two2
index 1 contains one
index 2 contains 20152
index 3 contains one2

其他add发生相同的事情,它们必须向下一个索引向下移动,以便列表中位于它们前面的值保持该状态。 因此,在另外两个添加之后,列表如下所示:

index 0 contains two2
index 1 contains one
index 2 contains two
index 3 contains 2015
index 4 contains 20152
index 5 contains one2

如果您尝试将所有内容从堆栈中弹出:

while ($stack->count()) {
    echo $stack->pop() . "\n";
}

你得到:

two2
one
two
2015
20152
one2

注意 :如果要在列表的顶部添加一个值,则必须使用unshift(value)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM