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',相等; - 第二个字符:
"100"的第二个字符是'0'(ASCII 48),"11"的第二个字符是'1'(ASCII 49); - 由于
'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
相关产品推荐
相关产品推荐

