在 php 中 中, 数组排序是非常常见的操作。 natsort和ksort是两个非常实用的排序函数 是两个非常实用的排序函数, 分别用于自然排序和按键排序。将它们结合使用, 可以实现更加灵活和精准的排序效果。本文将介绍natsort和ksort结合使用时的一些排序技巧和最佳实践。
Natsort ()
用于对数组的值进行自然排序) (自然顺序排序 (), 它会按照人类习惯对字符串中的数字部分进行排序, 它会按照人类习惯对字符串中的数字部分进行排序 比如, "img2"会排在"img10"前面。
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是在Natsort之后执行 之后执行, 因此最终数组是按照键升序排列, 但值的顺序不会完全反映自然排序的结果。 但值的顺序不会完全反映自然排序的结果。
如果你先想按键排序 如果你先想按键排序, 然后按值自然排序, 代码如下 :
<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 () , 则会重新索引数组, 丢失键。
决定先调用哪个函数取决于你想要排序的优先级 :
对于更复杂的排序逻辑, 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, l 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或uasort 。
结合 url 排序时 排序时, 可拆分键和值, 分别排序 分别排序, 方便实现精准排序。
通过合理利用Natsort ort KSORT , 可以在 PHP 中高效实现各种复杂排序需求。