當前位置: 首頁> 最新文章列表> 排序時如何防止natsort 函數改變數組的原始鍵值?

排序時如何防止natsort 函數改變數組的原始鍵值?

gitbox 2025-08-30

在PHP 中, natsort函數是一種常用的排序方法,它按照“自然順序”對數組中的元素進行排序。這種排序方式能夠更符合人類的閱讀習慣,比如數字“10”會排在“2”之前,而不是傳統的按ASCII 碼順序排序。但在使用natsort進行排序時,可能會遇到一個問題——它會重置數組的鍵值,使得原來的鍵值丟失。這可能會導致在後續操作中,難以根據原始的鍵值來訪問數據。

本文將討論如何避免natsort改變數組的原始鍵值,並介紹一些相關的技巧和替代方法。

natsort及其影響

natsort函數的功能是基於“自然順序”對數組進行排序。所謂自然順序排序,是指在排序時將數字按其大小排序,而不是按字符串的字典順序進行排序。例如:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'a20'</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

執行上述代碼後,輸出結果如下:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">2</span></span><span>] =&gt; a1
    [</span><span><span class="hljs-number">1</span></span><span>] =&gt; a2
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; a10
    [</span><span><span class="hljs-number">3</span></span><span>] =&gt; a20
)
</span></span>

你可以看到, natsort確實按數字的大小對數組進行了排序,但它重置了數組的鍵值,使得原來與元素相關的鍵不再保留。

如何防止鍵值丟失

如果你希望在使用natsort時保留原始的鍵值,可以在排序前先保存原數組的鍵值,然後再對排序後的數組進行重建。這樣可以確保排序過程不會影響到原始的鍵值。

方法1:使用array_valuesnatsort

可以通過將數組的值提取出來進行排序,而保持鍵值不變。這是通過array_values函數實現的。具體做法是先保留原始的鍵值,再進行排序:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-string">'a20'</span></span><span>];

</span><span><span class="hljs-comment">// 保存原始鍵值</span></span><span>
</span><span><span class="hljs-variable">$original_keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-comment">// 對值進行自然排序</span></span><span>
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-comment">// 恢復原始鍵值</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(</span><span><span class="hljs-variable">$original_keys</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

輸出結果:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [a] =&gt; a1
    [b] =&gt; a2
    [c] =&gt; a10
    [d] =&gt; a20
)
</span></span>

在這種方法中,首先通過array_keys獲取原始鍵值,然後使用natsort排序數組。排序完成後,使用array_combine恢復鍵值與排序後的值的對應關係。

方法2:使用uasort自定義排序

另一種方法是使用uasort函數進行自定義排序。與natsort類似, uasort可以對數組進行排序,但它不會更改鍵值。通過實現自定義的排序函數,你可以控制排序方式,同時保留原始的鍵值:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-string">'a20'</span></span><span>];

</span><span><span class="hljs-title function_ invoke__">uasort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strnatcmp</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>);
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

uasort通過回調函數實現排序,回調函數內部使用了strnatcmp函數來模擬自然順序的排序方式,且不改變數組的鍵值。

輸出結果:

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [c] =&gt; a1
    [b] =&gt; a2
    [a] =&gt; a10
    [d] =&gt; a20
)
</span></span>

總結

儘管natsort是一個很強大的排序函數,但它會重置數組的鍵值。如果需要在排序過程中保留鍵值,您可以採用以下兩種方法之一:

  1. 先保存原始鍵值,在排序後再通過array_combine恢復鍵值。

  2. 使用uasort函數進行自定義排序,從而避免鍵值丟失。

通過這兩種方法,您可以確保數組在自然排序後,仍能保持原始的鍵值不變,避免排序過程中的數據丟失。