當前位置: 首頁> 最新文章列表> natsort 和ksort 結合使用時,有哪些排序技巧和最佳實踐?

natsort 和ksort 結合使用時,有哪些排序技巧和最佳實踐?

gitbox 2025-06-13

php中,數組排序非常常見操作。


1。 Natsortksort的區別

  • natsort()
    用於對數組的值進行自然排序(自然順序排序),它會按照人類習慣對字符串中的數字部分進行排序

  • ksort()
    用於對數組的鍵進行升序排序,鍵必須是標量(字符串或數字)。


2。結合使用的常見場景

假設有一個數組,其鍵是字符串值是帶數字的字符串。你想先對值進行自然排序然後對排序後的數組按照鍵排序,或者反過來,這時結合


3。排序技巧

3.1先按值自然排序,再按鍵排序

如果你的目的是先根據數組的值自然排序,然後再根據鍵排序,可以按以下順序操作::

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [
    </span><span><span class="hljs-string">'b3'</span></span><span> =&gt; </span><span><span class="hljs-string">'img12'</span></span><span>,
    </span><span><span class="hljs-string">'a1'</span></span><span> =&gt; </span><span><span class="hljs-string">'img2'</span></span><span>,
    </span><span><span class="hljs-string">'c2'</span></span><span> =&gt; </span><span><span class="hljs-string">'img10'</span></span><span>
];

</span><span><span class="hljs-comment">// &#20808;&#25353;&#20540;&#33258;&#28982;&#25490;&#24207;&#65292;&#20445;&#30041;&#38190;&#20540;&#20851;&#31995;</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">// &#20877;&#25353;&#38190;&#25490;&#24207;</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ksort</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 class="hljs-meta">?&gt;</span></span><span>
</span></span>

執行結果:

 <span><span>Array
(
    [</span><span><span class="hljs-meta">a1</span></span><span>] =&gt; img2
    [</span><span><span class="hljs-meta">b3</span></span><span>] =&gt; img12
    [</span><span><span class="hljs-meta">c2</span></span><span>] =&gt; img10
)
</span></span>

注意:這裡ksort是在


3.2先按鍵排序,再按值自然排序

如果你先想按鍵排序,然後按值自然排序,代碼如下::

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [
    </span><span><span class="hljs-string">'b3'</span></span><span> =&gt; </span><span><span class="hljs-string">'img12'</span></span><span>,
    </span><span><span class="hljs-string">'a1'</span></span><span> =&gt; </span><span><span class="hljs-string">'img2'</span></span><span>,
    </span><span><span class="hljs-string">'c2'</span></span><span> =&gt; </span><span><span class="hljs-string">'img10'</span></span><span>
];

</span><span><span class="hljs-comment">// &#20808;&#25353;&#38190;&#25490;&#24207;</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ksort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-comment">// &#20877;&#25353;&#20540;&#33258;&#28982;&#25490;&#24207;</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 class="hljs-meta">?&gt;</span></span><span>
</span></span>

結果:

 <span><span>Array
(
    [</span><span><span class="hljs-meta">a1</span></span><span>] =&gt; img2
    [</span><span><span class="hljs-meta">c2</span></span><span>] =&gt; img10
    [</span><span><span class="hljs-meta">b3</span></span><span>] =&gt; img12
)
</span></span>

此時,鍵的順序在, ksort後被固定, natsort會重排值順序


4。最佳實踐

4.1保持鍵和值對應關係

natsort會保持數組的鍵和值的對應關係,不會重新索引數組,但它只對值排序。如果你使用sort() ,則會重新索引數組,丟失鍵。 ,丟失鍵。

4.2注意排序順序

決定先調用哪個函數取決於你想要排序的優先級:

  • 優先保證值的自然順序,再對鍵進行排序

  • 想優先保證鍵的順序,再對值自然排序,先ksort

4.3使用自定義排序函數

對於更複雜的排序邏輯,php提供了uksort()uasort()來對鍵或值使用自定義比較函數,這樣可以同時實現更靈活的排序規則。 ,這樣可以同時實現更靈活的排序規則。

例如,結合自然排序規則對鍵排序::

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [
    </span><span><span class="hljs-string">'b3'</span></span><span> =&gt; </span><span><span class="hljs-string">'img12'</span></span><span>,
    </span><span><span class="hljs-string">'a1'</span></span><span> =&gt; </span><span><span class="hljs-string">'img2'</span></span><span>,
    </span><span><span class="hljs-string">'c2'</span></span><span> =&gt; </span><span><span class="hljs-string">'img10'</span></span><span>
];

</span><span><span class="hljs-title function_ invoke__">uksort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, </span><span><span class="hljs-string">'strnatcmp'</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 class="hljs-meta">?&gt;</span></span><span>
</span></span>

5。結合實際url場景舉例

假設你有一組url,想根據url中的文件名自然排序,再根據域名排序(域名被替換為gitbox.net ,僅作為示例)::

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$urls</span></span><span> = [
    </span><span><span class="hljs-string">'site3.gitbox.net/path/img12.jpg'</span></span><span>,
    </span><span><span class="hljs-string">'site1.gitbox.net/path/img2.jpg'</span></span><span>,
    </span><span><span class="hljs-string">'site2.gitbox.net/path/img10.jpg'</span></span><span>
];

</span><span><span class="hljs-comment">// &#20808;&#25552;&#21462;&#36335;&#24452;&#37096;&#20998;&#20316;&#20026;&#20540;&#65292;&#22495;&#21517;&#37096;&#20998;&#20316;&#20026;&#38190;</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$urls</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$url</span></span><span>) {
    </span><span><span class="hljs-variable">$parsed</span></span><span> = </span><span><span class="hljs-title function_ invoke__">parse_url</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
    </span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-variable">$parsed</span></span><span>[</span><span><span class="hljs-string">'host'</span></span><span>]; </span><span><span class="hljs-comment">// gitbox.net</span></span><span>
    </span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-variable">$parsed</span></span><span>[</span><span><span class="hljs-string">'path'</span></span><span>]; </span><span><span class="hljs-comment">// /path/img12.jpg</span></span><span>
    </span><span><span class="hljs-variable">$array</span></span><span>[</span><span><span class="hljs-variable">$host</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>); </span><span><span class="hljs-comment">// img12.jpg</span></span><span>
}

</span><span><span class="hljs-comment">// &#20808;&#23545;&#20540;&#36827;&#34892;&#33258;&#28982;&#25490;&#24207;</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">// &#20877;&#23545;&#38190;&#36827;&#34892;&#25490;&#24207;</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ksort</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 class="hljs-meta">?&gt;</span></span><span>
</span></span>

此時數組既保持了對文件名的自然排序,又保證了鍵(域名)的順序。


總結

  • Natsort對數組的做自然排序,保持鍵值對應關係。

  • ksort對數組的做升序排序。

  • 結合使用時,先後順序影響最終排序結果,選擇合適的順序以滿足需求。 ,選擇合適的順序以滿足需求。

  • 對於復雜排序,可以用自定義函數配合uksort

  • 結合url排序時,可拆分鍵和值,分別排序,方便實現精準排序。 ,方便實現精準排序。

通過合理利用NATSORTksort ,可以在php中高效實現各種複雜排序需求。