PHP数组排序面试题及详细答案(实战版)_第1页
PHP数组排序面试题及详细答案(实战版)_第2页
PHP数组排序面试题及详细答案(实战版)_第3页
PHP数组排序面试题及详细答案(实战版)_第4页
PHP数组排序面试题及详细答案(实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP数组排序面试题及详细答案(实战版)本文汇总PHP面试高频数组排序考题,从基础函数辨析到多维数组实战排序,贴合一线面试真实提问场景,答案简洁精准、偏向开发实战,适合面试刷题、技术复盘。一、基础概念题(入门必考)1、PHP中常用的数组排序函数有哪些?请区分索引数组和关联数组适用场景参考答案:PHP数组排序函数分为重置键名和保留键名两大类,核心常用函数如下:1)针对索引数组(纯数字连续键)sort():升序排序,重置键名,排序后数组键从0开始重新排列rsort():降序排序,重置键名2)针对关联数组(自定义字符串/数字键)asort():按值升序,保留原键名arsort():按值降序,保留原键名ksort():按键名升序,保留原键名krsort():按键名降序,保留原键名补充:所有上述函数均为引用传值,直接修改原数组,返回值仅为布尔值(true/false),不返回新数组。2、sort()和asort()核心区别是什么?日常开发中怎么选择使用?参考答案:核心区别:键名是否保留1)sort():排序后强制重置数组键名,适合纯索引数组,只需要排序后顺序,不需要原始键值对应关系;2)asort():排序后完整保留原数组的键名和值的对应关系,适合关联数组,需保留字段标识、ID等键信息的场景。使用场景选择:仅排序纯列表数据(如[3,1,2])用sort();需要根据数组值排序,且不能丢失键标识(如['name'=>'张三','age'=>20])必须用asort()。3、PHP数组排序默认的排序规则是什么?会出现什么经典问题?参考答案:PHP普通排序函数(sort/asort/ksort)默认是ASCII码排序,同时存在数字与字符串混合弱类型排序问题。经典坑点:纯数字字符串和数字混合排序异常,例如[10,2,'3'],默认排序结果为[2,3,10]看似正常,但字符串数字优先按字符逐位对比,['10','2']排序结果为['10','2'],因为字符'1'的ASCII码小于'2'。解决方式:使用自定义排序函数,强制按数值类型排序。二、基础实操代码题(手写代码必考)1、将索引数组$arr=[5,2,9,1,5,6]分别实现升序、降序排序参考答案:PlainText

<?php

$arr=[5,2,9,1,5,6];

//升序排序(重置键名)

sort($arr);

print_r($arr);//输出:[1,2,5,5,6,9]

//降序排序(重置键名)

rsort($arr);

print_r($arr);//输出:[9,6,5,5,2,1]

?>2、将关联数组$arr=['b'=>3,'a'=>1,'c'=>2]按值升序、按键名降序排序参考答案:PlainText

<?php

$arr=['b'=>3,'a'=>1,'c'=>2];

//按值升序(保留键名)

asort($arr);

print_r($arr);//a:1,c:2,b:3

//按键名降序(保留键名)

krsort($arr);

print_r($arr);//c:2,b:3,a:1

?>三、进阶核心考题(面试高频难点)1、请说说usort()、uasort()、uksort()的区别及适用场景参考答案:这三个是PHP自定义排序函数,支持开发者自定义排序规则,解决默认排序的局限性,均为引用排序。usort():自定义按值排序,排序后重置键名,适用于索引数组自定义规则排序uasort():自定义按值排序,保留原键名,适用于关联数组按值自定义排序(最常用)uksort():自定义按键名排序,保留原键名,适用于需要自定义键名排序规则的场景自定义排序回调函数规则:回调返回正数、负数、0控制排序return大于0:交换两个元素位置return小于0:不交换位置return等于0:位置不变2、解决经典问题:数组[10,2,25,3]实现纯数值升序排序(修正默认ASCII排序bug)问题分析:直接sort排序会出现[10,2,25,3]错误结果,因为默认按字符排序参考答案:PlainText

<?php

$arr=[10,2,25,3];

//自定义数值升序排序

usort($arr,function($a,$b){

return$a-$b;

});

print_r($arr);//正确结果:[2,3,10,25]

//数值降序只需反转差值

//return$b-$a;

?>3、多维数组排序:将二维用户数组,按年龄age升序排序,年龄相同按分数score降序排序测试数组:PlainText

$user=[

['name'=>'张三','age'=>22,'score'=>80],

['name'=>'李四','age'=>20,'score'=>90],

['name'=>'王五','age'=>22,'score'=>85]

];参考答案:PlainText

<?php

$user=[

['name'=>'张三','age'=>22,'score'=>80],

['name'=>'李四','age'=>20,'score'=>90],

['name'=>'王五','age'=>22,'score'=>85]

];

//多维自定义排序

usort($user,function($a,$b){

//先按年龄升序

if($a['age']!=$b['age']){

return$a['age']-$b['age'];

}

//年龄相同,按分数降序

return$b['score']-$a['score'];

});

print_r($user);

?>排序结果说明:李四(20岁)优先,其次王五(22岁85分)、张三(22岁80分),符合业务优先级规则。四、面试陷阱题(高频扣分点)1、判断代码对错:$newArr=sort($arr);能否获取排序后的数组?参考答案:错误所有PHP基础排序函数(sort、asort、rsort等)都是引用传参,直接修改原数组,返回值是布尔值true/false,代表排序是否成功。正确写法:先执行排序函数,直接使用原数组,不能用变量接收返回值。2、shuffle()函数的作用和特性是什么?有什么使用注意点?参考答案:shuffle()是数组随机打乱排序函数,特性:1)引用修改原数组,返回布尔值;2)强制重置键名,无论原数组是索引还是关联数组,打乱后都会变成0开始的连续数字索引;3)适合抽奖、随机展示列表等场景,需要保留键名的场景禁止使用。3、natsort()和普通sort()的区别?什么场景用自然排序?参考答案:sort():ASCII字符排序,逐位对比字符,适合纯字符、纯数字数组;natsort():自然排序,识别字符串中的数字整体大小,解决文件名称、版本号排序问题。示例:文件数组['img10.png','img2.png','img1.png']sort排序结果:img1.png、img10.png、img2.png(错误)natsort排序结果:img1.png、img2.png、img10.png(符合人工认知)适用场景:文件排序、版本号排序、带数字的字符串排序。五、综合手写真题(面试压轴题)题目:自定义函数,实现关联数组按指定字段排序,支持升序/降序自定义需求:封装通用排序方法,可对任意二维数组,指定键名、指定排序方式参考答案(通用实战代码):PlainText

<?php

/**

*二维数组通用排序

*@paramarray$arr待排序数组

*@paramstring$key排序字段

*@paramint$sort排序方式1升序-1降序

*@returnvoid

*/

functionarraySort($arr,$key,$sort=1)

{

uasort($arr,function($a,$b)use($key,$sort){

if($a[$key]==$b[$key]){

return0;

}

//根据排序方式返回正负值

return$a[$key]>$b[$key]?$sort:-$sort;

});

return$arr;

}

//测试调用

$list=[

['id'=>3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论