在php中,數組排序是非常常見的操作。
natsort()
(用於對數組的值進行自然排序(自然順序排序),它會按照人類習慣對字符串中的數字部分進行排序
ksort()
用於對數組的鍵進行升序排序,鍵必須是標量(字符串或數字)。
假設有一個數組,其鍵是字符串,值是帶數字的字符串。你想先對值進行自然排序,然後對排序後的數組按照鍵排序,或者反過來,這時結合
如果你的目的是先根據數組的值自然排序,然後再根據鍵排序,可以按以下順序操作::
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [
</span><span><span class="hljs-string">'b3'</span></span><span> => </span><span><span class="hljs-string">'img12'</span></span><span>,
</span><span><span class="hljs-string">'a1'</span></span><span> => </span><span><span class="hljs-string">'img2'</span></span><span>,
</span><span><span class="hljs-string">'c2'</span></span><span> => </span><span><span class="hljs-string">'img10'</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-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">?></span></span><span>
</span></span>
執行結果:
<span><span>Array
(
[</span><span><span class="hljs-meta">a1</span></span><span>] => img2
[</span><span><span class="hljs-meta">b3</span></span><span>] => img12
[</span><span><span class="hljs-meta">c2</span></span><span>] => img10
)
</span></span>
注意:這裡的ksort是在
如果你先想按鍵排序,然後按值自然排序,代碼如下::
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [
</span><span><span class="hljs-string">'b3'</span></span><span> => </span><span><span class="hljs-string">'img12'</span></span><span>,
</span><span><span class="hljs-string">'a1'</span></span><span> => </span><span><span class="hljs-string">'img2'</span></span><span>,
</span><span><span class="hljs-string">'c2'</span></span><span> => </span><span><span class="hljs-string">'img10'</span></span><span>
];
</span><span><span class="hljs-comment">// 先按键排序</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">// 再按值自然排序</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">?></span></span><span>
</span></span>
結果:
<span><span>Array
(
[</span><span><span class="hljs-meta">a1</span></span><span>] => img2
[</span><span><span class="hljs-meta">c2</span></span><span>] => img10
[</span><span><span class="hljs-meta">b3</span></span><span>] => img12
)
</span></span>
此時,鍵的順序在, ksort後被固定, natsort會重排值順序
natsort會保持數組的鍵和值的對應關係,不會重新索引數組,但它只對值排序。如果你使用sort() ,則會重新索引數組,丟失鍵。 ,丟失鍵。
決定先調用哪個函數取決於你想要排序的優先級:
想優先保證值的自然順序,再對鍵進行排序,先
想優先保證鍵的順序,再對值自然排序,先ksort ,後
對於更複雜的排序邏輯,php提供了uksort()和uasort()來對鍵或值使用自定義比較函數,這樣可以同時實現更靈活的排序規則。 ,這樣可以同時實現更靈活的排序規則。
例如,結合自然排序規則對鍵排序::
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [
</span><span><span class="hljs-string">'b3'</span></span><span> => </span><span><span class="hljs-string">'img12'</span></span><span>,
</span><span><span class="hljs-string">'a1'</span></span><span> => </span><span><span class="hljs-string">'img2'</span></span><span>,
</span><span><span class="hljs-string">'c2'</span></span><span> => </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">?></span></span><span>
</span></span>
假設你有一組url,想根據url中的文件名自然排序,再根據域名排序(域名被替換為gitbox.net ,僅作為示例)::
<span><span><span class="hljs-meta"><?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">// 先提取路径部分作为值,域名部分作为键</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">// 先对值进行自然排序</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-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">?></span></span><span>
</span></span>
此時數組既保持了對文件名的自然排序,又保證了鍵(域名)的順序。
Natsort對數組的值做自然排序,保持鍵值對應關係。
ksort對數組的鍵做升序排序。
結合使用時,先後順序影響最終排序結果,選擇合適的順序以滿足需求。 ,選擇合適的順序以滿足需求。
對於復雜排序,可以用自定義函數配合uksort或
結合url排序時,可拆分鍵和值,分別排序,方便實現精準排序。 ,方便實現精準排序。
通過合理利用NATSORT和ksort ,可以在php中高效實現各種複雜排序需求。