လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Natsort နှင့် Ksort ကိုသုံးသောအခါအဘယ်အဘယ်သို့သောအကြံပေးချက်များနှင့်အကောင်းဆုံးအလေ့အကျင့်များရှိသနည်း။

Natsort နှင့် Ksort ကိုသုံးသောအခါအဘယ်အဘယ်သို့သောအကြံပေးချက်များနှင့်အကောင်းဆုံးအလေ့အကျင့်များရှိသနည်း။

gitbox 2025-06-13

在 php 中, 数组排序是非常常见的操作။ natsortksort是两个非常实用的排序函数, 分别用于自然排序和按键排序, 分别用于自然排序和按键排序, 可以实现更加灵活和精准的排序效果, 可以实现更加灵活和精准的排序效果natsort和 natsort 和ksort结合使用时的一些排序技巧和最佳实践။


1 ။ 了解natsortksort的区别

  • Natsort ()
    用于对数组的值进行自然排序 (自然顺序排序), 它会按照人类习惯对字符串中的数字部分进行排序, 比如"img2" im "img10" 前面 "img10"前面။

  • ksort ()
    用于对数组的键进行升序排序, 键必须是标量 (字符串或数字) ။


2 ။ 结合使用的常见场景

假设有一个数组, 其键是字符串, 值是带数字的字符串။ 你想先对值进行自然排序။ 你想先对值进行自然排序, 然后对排序后的数组按照键排序, 或者反过来, 这时结合, 这时结合natsortksort就派上用场了။


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是在natsort之后执行, 因此最终数组是按照键升序排列, 但值的顺序不会完全反映自然排序的结果, 但值的顺序不会完全反映自然排序的结果။


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 注意排序顺序

决定先调用哪个函数取决于你想要排序的优先级:

  • 想优先保证值的自然顺序, 再对键进行排序, 先Natsort , 后ksort

  • 想优先保证键的顺序, 再对值自然排序, 先ksort , 后natsort

4.3 使用自定义排序函数

对于更复杂的排序逻辑, PHP 提供了提供了UKSARE ()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 中的文件名自然排序, 再根据域名排序 (域名被替换为gitagox.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对数组的做升序排序။

  • 结合使用时, 先后顺序影响最终排序结果, 选择合适的顺序以满足需求, 选择合适的顺序以满足需求။

  • 对于复杂排序, 可以用自定义函数配合unksortuasort

  • 结合 url 结合, 可拆分键和值, 分别排序, 方便实现精准排序, 方便实现精准排序။

通过合理利用natsortksort , 可以在 php 中高效实现各种复杂排序需求။