Aktueller Standort: Startseite> Neueste Artikel> Welche Art von Tipps und Best Practices gibt es bei der Verwendung von Natsort und Ksort?

Welche Art von Tipps und Best Practices gibt es bei der Verwendung von Natsort und Ksort?

gitbox 2025-06-13

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


1. 了解NatsortKSORT的区别

  • natsort ()
    用于对数组的值进行自然排序(自然顺序排序) , 它会按照人类习惯对字符串中的数字部分进行排序 , 比如"img2"会排在"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 提供了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对数组的做升序排序。

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

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

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

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