PHP面试总结

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 — 任意精度数字的二次方根

还有一些就是上机操作了,这倒是最好解决的,作为码农,这个我还是喜欢的。

总的来说,面试我觉得是最有收获的,首先不管答不答的上来,最起码知道了自己的不足,知道了要补习那些个方面,也好再去努力。闭门造车我们可永远不会进步


加油!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值