You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中array_multisort排序疑问:数字字符排序逻辑及示例解析

关于PHP array_multisort的排序疑问解答

嘿,咱们一步步来拆解你的两个核心问题:

一、数字与字符的ASCII值及排序优先级

首先明确几个关键点:

  • 数字字符('0'到'9')的ASCII值范围是48-57,小写字母('a'到'z')是97-122,大写字母是65-90。所以不管是数字类型还是数字字符串,在按字符串规则排序时,都会排在字母前面。
  • array_multisort的排序类型(SORT_STRING/SORT_NUMERIC)会直接改变比较逻辑:
    • 用SORT_NUMERIC时,所有元素会被转成数字比较,按数字大小排序;
    • 用SORT_STRING时,元素会被转成字符串,按ASCII值逐字符对比排序。

二、官方示例的排序逻辑拆解

先把示例代码格式化得更清晰:

$ar = array(
    array("10", 11, 100, 100, "a"), // 第一排序维度数组
    array(1, 2, "2", 3, 1)          // 第二排序维度数组
);

array_multisort(
    $ar[0], SORT_ASC, SORT_STRING,  // 规则1:按第一数组升序、字符串规则排序
    $ar[1], SORT_NUMERIC, SORT_DESC // 规则2:第一数组元素相等时,按第二数组降序、数字规则排序
);

var_dump($ar);

疑问1:为什么"10"之后是100而不是11?

因为这里指定了SORT_STRING排序规则,所有元素都会被转成字符串后逐字符对比:

  • 整数11会被转成字符串"11",整数100会被转成"100"
  • 字符串对比逻辑:
    1. 第一个字符都是'1',相等;
    2. 第二个字符:"100"的第二个字符是'0'(ASCII 48),"11"的第二个字符是'1'(ASCII 49);
    3. 由于'0' < '1',所以"100" < "11",因此100会排在11前面。

疑问2:第一个数组有两个100时,为什么用第二个数组排序?

这是array_multisort的核心工作机制:当第一个排序数组中出现相等的元素时,会自动使用后续指定的数组作为次要排序依据。
在示例中:

  • 第一个数组的两个100(原数组位置2和3),对应的第二个数组元素是"2"和3;
  • 第二数组指定了SORT_NUMERIC(将"2"转成数字2)和SORT_DESC(降序);
  • 因为3 > 2,所以对应第一个数组的100(原位置3)会排在100(原位置2)前面,最终第二数组的对应位置就是3、"2"。

内容的提问来源于stack exchange,提问作者user9718914

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:13:09