PHP面试总结
金三银四招聘季,我也是按奈不住躁动的小心思呀。于是也出去试试水。背景介绍,本人差不多一年半的phper小菜鸟。可能懂得不多,了解的也不够有深度,于是处于试
水阶段,目前这家公司福利待遇在武汉还好吧,最起码比起武汉大部分没有五险一金的好的多,就是工资可能是我的短板,技术提升困难,自然在公司价值就越来越小。所
以就想也出去转转,毕竟我还是有一颗流浪的心。闲话不多说了,直接进入正题:
我接到面试的这家公司也是个小公司,可能我阅历不足,一看名字[**网络公司],我以为就是搞开发的,于是就直接去了。首先去了是人事的小姐姐接待的,聊聊一些“题
外“话,也就是聊聊你的大学生活,工作经历呀,还有就是之前工作的薪资待遇呀,对于以后的规划呀,还有就是对于工资的大概期待呀这些。最后让我做了一套面试题。其
实也不是一套,就做一个关于我们PHP的面试题。
题目 给定一个一维数组,数组里面有重复的元素,让我们自己写一个方法,去掉数组里面重复的元素
我一想,这还不简单,在我们PHP的原生函数里面就有好几种呀,
array_inuque()
接受 array 作为输入并返回没有重复值的新数组;
$arr = [1,3,5,6,3,6,5,8,9,5,9];
$arr = array_unique($arr);
var_dump($arr);
array(6) {
[0] =>
int(1)
[1] =>
int(3)
[3] =>
int(5)
[6] =>
int(6)
[8] =>
int(8)
[9] =>
int(9)
}
array_flip()
交换数组中的键和值;
如果同一个值出现多次,则最后一个键名将作为它的值,其它键会被丢弃。
//反转第一次
$arr = [1,3,5,6,3,6,5,8,9,5,9];
$arr = array_flip($arr);
array(6) {
[1] =>
int(0)
[3] =>
int(2)
[5] =>
int(5)
[6] =>
int(7)
[8] =>
int(8)
[9] =>
int(10)
}
我们得到的数组,原来的键是现在的值,现在的值是原来的键,看起来很怪,接下来再反转一次;
$arr = array_flip($arr);
array(6) {
[0] =>
int(1)
[2] =>
int(3)
[5] =>
int(5)
[7] =>
int(6)
[8] =>
int(8)
[10] =>
int(9)
}
看起来没什么问题,但是追求完美的我们这样必须不行,于是我们再次使用数组函数array_merge()
$arr = array_merge($arr);
array(6) {
[0] =>
int(1)
[1] =>
int(3)
[2] =>
int(5)
[3] =>
int(6)
[4] =>
int(8)
[5] =>
int(9)
}
这次就完美了。可以得到最后去重的数组了。但是这有一个问题,这是PHP本身的函数实现的,没有达到效果,要我们自己实现一个算法去实现。
思路一:新建一个空数组,然后循环给定的数组,判断新数组里面是否有当前循环的值,有就不丢进去,否则就丢进去
<?php
function removeArrayValue($arr) {
if (!is_array($arr)) {
return [];
}
$arrLen = count($arr);
if ($arrLen <= 1) {
return $arr;
}
$tmpArr = [];
for ($i = 0; $i < $arrLen; $i++) {
if (!in_array($arr[$i],$tmpArr)) {
$tmpArr[] = $arr[$i];
}
}
return $tmpArr;
}
/*
array(6) {
[0] =>
int(1)
[1] =>
int(3)
[2] =>
int(5)
[3] =>
int(6)
[4] =>
int(8)
[5] =>
int(9)
}
*/
这里有两点需要注意,1 我们判断数组的值是否存在,用了PHP数组函数in_array()
,其实还可以使用array_search()
,它也是可以判断数组中某个值是否存在,
2 就是我们对新数组的赋值,可以是上面写的那样,同时也可以使用数组函数array_push()
和array_unshift()
接下来就来了一个技术主管吧,应该是,他主要问的就是关于数据库方面的知识了。
问题一:有一张表,假如有 | name | age | balance |。现在插入数据,liyi,18,200 | wanger,19,300 | zhangsan,20,400 | liyi,18,600|假设
有四组数据,现在要得到去重后的每个玩家的余额最大值的那条记录。我的思路有两条,一个是我们直接使用SQL去重函数distinct
,还有一个就是分组group by
-- 上面假设表名是balance;
drop table if exists balance;
create table if not exists balance(
`id` int UNSIGNED primary key auto_increment,
`user` varchar(10) not null,
`age` tinyint(3) not null default 18,
`balances` DECIMAL(5,3) not null
)engine=innodb default charset=utf8;
insert into balance (`user`,`age`,`balances`) values ('liyi',18,20.2);
insert into balance (`user`,`age`,`balances`) values ('wanger',19,30.25);
insert into balance (`user`,`age`,`balances`) values ('zhangsan',20,69);
insert into balance (`user`,`age`,`balances`) values ('liyi',18,89);
select id,`user`,age,max(balances)as balances from balance group by `user`;
问题二:mysql数据库里面,有一个人的余额是1000;这时候要操作这个人的余额减去100;这个时候同时进来了100个恶意请求,怎么防止余额超支,其实这个也算是
高并发这块的了。还有就是属于遭到恶意攻击了。
首先既然是更新数据库里面的数据,首先要设定数据表的存储引擎是innodb
,它是支持事务的,还有就是行级锁,接下来就是事务内操作,成功就提交,失败则回滚。
还有它既然想要大量的减少我们的数据表的余额这个字段的值,也就是和盗刷差不多,我们还要做的就是,不能让它在小于临界值时还可以操作。大概思路就是这样,具体
在接下来另做实现。
问题三:就是操作加减乘除,但是不可以四舍五入。这个就是最简单了。咱们大PHP有库呀。bcmath
的库。对于金钱类的操作就可以用这个了呀
bcscale
— 设置所有bc数学函数的默认小数点保留位数bcadd
— 2个任意精度数字的加法计算bcsub
— 2个任意精度数字的减法bcdiv
— 2个任意精度的数字除法计算bcmul
— 2个任意精度数字乘法计算bccomp
— 比较两个任意精度的数字bcmod
— 对一个任意精度数字取模bcpow
— 任意精度数字的乘方bcsqrt
— 任意精度数字的二次方根
还有一些就是上机操作了,这倒是最好解决的,作为码农,这个我还是喜欢的。
总的来说,面试我觉得是最有收获的,首先不管答不答的上来,最起码知道了自己的不足,知道了要补习那些个方面,也好再去努力。闭门造车我们可永远不会进步
加油!