簡體   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