PHP 面试题
2021/6/15 12:21:24
本文主要是介绍PHP 面试题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
明天就双十一了,准备好剁手了吗?我是没什么买的了,今天给大家推荐一些 PHP 面试题。
反转函数的实现
-
/**
-
* 反转数组
-
* @param array $arr
-
* @return array
-
*/
-
function reverse($arr)
-
{
-
$n = count($arr);
-
-
$left = 0;
-
$right = $n - 1;
-
-
while ($left < $right) {
-
$temp = $arr[$left];
-
$arr[$left++] = $arr[$right];
-
$arr[$right--] = $temp;
-
}
-
-
return $arr;
-
}
-
>>> reverse(range(1,10))
-
=> [
-
10,
-
9,
-
8,
-
7,
-
6,
-
5,
-
4,
-
3,
-
2,
-
1,
-
]
两个有序int集合是否有相同元素的最优算法
-
/**
-
* 寻找两个有序数组里相同的元素
-
* @param array $arr1
-
* @param array $arr2
-
* @return array
-
*/
-
function find_common($arr1, $arr2)
-
{
-
$common = array();
-
$i = $j = 0;
-
$count1 = count($arr1);
-
$count2 = count($arr2);
-
while ($i < $count1 && $j < $count2) {
-
if ($arr1[$i] < $arr2[$j]) {
-
$i++;
-
} elseif ($arr1[$i] > $arr2[$j]) {
-
$j++;
-
} else {
-
$common[] = $arr1[$i];
-
$i++;
-
$j++;
-
}
-
}
-
return array_unique($common);
-
}
-
print_r(find_common(range(1,10),range(5,15)));
-
Array
-
(
-
[0] => 5
-
[1] => 6
-
[2] => 7
-
[3] => 8
-
[4] => 9
-
[5] => 10
-
)
将一个数组中的元素随机
-
/**
-
* 打乱数组
-
* @param array $arr
-
* @return array
-
*/
-
function custom_shuffle($arr)
-
{
-
$n = count($arr);
-
for ($i = 0; $i < $n; $i++) {
-
$rand_pos = mt_rand(0, $n);
-
if ($rand_pos != $i) {
-
$temp = $arr[$i];
-
$arr[$i] = $arr[$rand_pos];
-
$arr[$rand_pos] = $temp;
-
}
-
}
-
return $arr;
-
}
-
>>> custom_shuffle(range(1,5))
-
=> [
-
5,
-
3,
-
1,
-
4,
-
2,
-
]
给一个有数字和字母的字符串,让连着的数字和字母对应
-
function number_alphabet($str)
-
{
-
$number = preg_split('/[a-z]+/', $str, -1, PREG_SPLIT_NO_EMPTY);
-
$alphabet = preg_split('/\d+/', $str, -1, PREG_SPLIT_NO_EMPTY);
-
$n = count($number);
-
for ($i = 0; $i < $count; $i++) {
-
echo $number[$i] . ':' . $alphabet[$i] . '</br>';
-
}
-
}
-
$str = '1a3bb44a2ac';
-
number_alphabet($str);//1:a 3:bb 44:a 2:ac
求n以内的质数
-
/**
-
* 求n内的质数
-
* @param int $n
-
* @return array
-
*/
-
function get_prime($n)
-
{
-
$prime = array(2);//2为质数
-
-
for ($i = 3; $i <= $n; $i += 2) {//偶数不是质数,步长可以加大
-
$sqrt = intval(sqrt($i));//求根号n
-
-
for ($j = 3; $j <= $sqrt; $j += 2) {//i是奇数,当然不能被偶数整除,步长也可以加大。
-
if ($i % $j == 0) {
-
break;
-
}
-
}
-
-
if ($j > $sqrt) {
-
array_push($prime, $i);
-
}
-
}
-
-
return $prime;
-
}
-
-
>>> get_prime(10)
-
=> [
-
2,
-
3,
-
5,
-
7,
-
]
约瑟夫环问题
-
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号
-
/**
-
* 获取大王
-
* @param int $n
-
* @param int $m
-
* @return int
-
*/
-
function get_king_mokey($n, $m)
-
{
-
$arr = range(1, $n);
-
-
$i = 0;
-
-
while (count($arr) > 1) {
-
$i++;
-
$survice = array_shift($arr);
-
-
if ($i % $m != 0) {
-
array_push($arr, $survice);
-
}
-
}
-
-
return $arr[0];
-
}
-
var_dump(get_king_mokey(10,10));//8
-
function getKingMokey($n, $m)
-
{
-
$monkey[0] = 0;
-
//将1-n只猴子顺序编号 入数组中
-
for($i= 1; $i<= $n; $i++)
-
{
-
$monkey[$i] = $i;
-
}
-
$len = count($monkey);
-
//循环遍历数组元素(猴子编号)
-
for($i= 0; $i< $len; $i= $i)
-
{
-
$num = 0;
-
/*
-
* 遍历$monkey数组,计算数组中值不为0的元素个数(剩余猴子的个数)
-
* 赋值为$num,并获取值不为0的元素的元素值
-
*/
-
foreach($monkey as $key => $value)
-
{
-
if($value == 0) continue;
-
$num++;
-
$values = $value;
-
}
-
//若只剩一只猴子 则输出该猴子编号(数组元素值) 并退出循环
-
if($num == 1)
-
{
-
return $values;
-
exit;
-
}
-
/*
-
* 若剩余猴子数大于1($num > 1)
-
* 继续程序
-
*/
-
//将第$i只猴子踢出队伍(相应数组位置元素值设为0)
-
$monkey[$i] = 0;
-
/*
-
* 获取下一只需要踢出队伍的猴子编号
-
* 在$m值范围内遍历猴子 并设置$m的计数器
-
* 依次取下一猴子编号
-
* 若元素值为0,则该位置的猴子已被踢出队伍
-
* 若不为0,继续获取下一猴子编号,且计数器加1
-
* 若取得的猴子编号大于数组个数
-
* 则从第0只猴子开始遍历(数组指针归零) 步骤同上
-
* 直到计数器到达$m值 * 最后获取的$i值即为下一只需要踢出队伍的猴子编号
-
*/
-
//设置计数器
-
for($j= 1; $j<= $m; $j++)
-
{
-
//猴子编号加一,遍历下一只猴子
-
$i++;
-
//若该猴子未被踢出队伍,获取下一只猴子编号
-
if($monkey[$i] > 0) continue;
-
//若元素值为0,则猴子已被踢出队伍,进而循环取下一只猴子编号
-
if($monkey[$i] == 0)
-
{
-
//取下一只猴子编号
-
for($k= $i; $k< $len; $k++)
-
{
-
//值为0,编号加1
-
if($monkey[$k] == 0) $i++;
-
//否则,编号已取得,退出
-
if($monkey[$k] > 0) break;
-
}
-
}
-
//若编号大于猴子个数,则从第0只猴子开始遍历(数组指针归零) 步骤同上
-
if($i == $len) $i = 0;
-
//同上步骤,获取下一只猴子编号
-
if($monkey[$i] == 0)
-
{
-
for($k= $i; $k< $len; $k++)
-
{
-
if($monkey[$k] == 0) $i++;
-
if($monkey[$k] > 0) break;
-
}
-
}
-
}
-
}
-
}
-
//猴子个数
-
$n = 10;
-
//踢出队伍的编号间隔值
-
$m = 3;
-
//调用猴王获取函数https://9iphp.com/web/php/1112.html
-
echo getKingMokey($n, $m)."是猴王";
-
function yuesefu($n,$m) {
-
$r=0;
-
for($i=2; $i<=$n; $i++) {
-
$r=($r+$m)%$i;
-
}
-
return $r+1;
-
}
-
echo yuesefu(10,3)."是猴王";
快速寻找一个数组里最小的1000个数
-
//输入n个整数,输出其中最小的k个。
-
/**
-
* 获取最小的k个数
-
* @param array $arr
-
* @param int $k [description]
-
* @return array
-
*/
-
function get_min_array($arr, $k)
-
{
-
$n = count($arr);
-
-
$min_array = array();
-
-
for ($i = 0; $i < $n; $i++) {
-
if ($i < $k) {
-
$min_array[$i] = $arr[$i];
-
} else {
-
if ($i == $k) {
-
$max_pos = get_max_pos($min_array);
-
$max = $min_array[$max_pos];
-
}
-
-
if ($arr[$i] < $max) {
-
$min_array[$max_pos] = $arr[$i];
-
-
$max_pos = get_max_pos($min_array);
-
$max = $min_array[$max_pos];
-
}
-
}
-
}
-
-
return $min_array;
-
}
-
-
/**
-
* 获取最大的位置
-
* @param array $arr
-
* @return array
-
*/
-
function get_max_pos($arr)
-
{
-
$pos = 0;
-
for ($i = 1; $i < count($arr); $i++) {
-
if ($arr[$i] > $arr[$pos]) {
-
$pos = $i;
-
}
-
}
-
-
return $pos;
-
}
-
-
$array = [1, 100, 20, 22, 33, 44, 55, 66, 23, 79, 18, 20, 11, 9, 129, 399, 145, 2469, 58];
-
-
$min_array = get_min_array($array, 10);
-
-
print_r($min_array);
-
Array
-
(
-
[0] => 1
-
[1] => 18
-
[2] => 20
-
[3] => 22
-
[4] => 33
-
[5] => 44
-
[6] => 9
-
[7] => 11
-
[8] => 23
-
[9] => 20
-
)
在有序的数组中找到一个数的位置
-
/**
-
* 二分查找
-
* @param array $array 数组
-
* @param int $n 数组数量
-
* @param int $value 要寻找的值
-
* @return int
-
*/
-
function binary_search($array, $n, $value)
-
{
-
$left = 0;
-
$right = $n - 1;
-
-
while ($left <= $right) {
-
$mid = intval(($left + $right) / 2);
-
if ($value > $mid) {
-
$right = $mid + 1;
-
} elseif ($value < $mid) {
-
$left = $mid - 1;
-
} else {
-
return $mid;
-
}
-
}
-
-
return -1;
-
}
-
>>> binary_search(range(1,5),5,2)
-
=> 2
一个有序整数序列,找出绝对值最小的元素
-
/**
-
* 获取绝对值最小的元素
-
* @param array $arr
-
* @return int
-
*/
-
function get_min_abs_value($arr)
-
{
-
//如果符号相同,直接返回
-
if (is_same_sign($arr[0], $arr[$n - 1])) {
-
return $arr[0] >= 0 ? $arr[0] : $arr[$n - 1];
-
}
-
-
//二分查找
-
$n = count($arr);
-
$left = 0;
-
$right = $n - 1;
-
-
while ($left <= $right) {
-
if ($left + 1 === $right) {
-
return abs($arr[$left]) < abs($arr[$right]) ? $arr[$left] : $arr[$right];
-
}
-
-
$mid = intval(($left + $right) / 2);
-
-
if ($arr[$mid] < 0) {
-
$left = $mid + 1;
-
} else {
-
$right = $mid - 1;
-
}
-
}
-
}
-
-
/**
-
* 判断符号是否相同
-
* @param int $a
-
* @param int $b
-
* @return boolean
-
*/
-
function is_same_sign($a, $b)
-
{
-
if ($a * $b > 0) {
-
return true;
-
} else {
-
return false;
-
}
-
}
找出有序数组中随机3个数和为0的所有情况
-
function three_sum($arr)
-
{
-
$n = count($arr);
-
-
$return = array();
-
-
for ($i=0; $i < $n; $i++) {
-
$left = $i + 1;
-
$right = $n - 1;
-
-
while ($left <= $right) {
-
$sum = $arr[$i] + $arr[$left] + $arr[$right];
-
-
if ($sum < 0) {
-
$left++;
-
} elseif ($sum > 0) {
-
$right--;
-
} else {
-
$numbers = $arr[$i] . ',' . $arr[$left] . ',' . $arr[$right];
-
if (!in_array($numbers, $return)) {
-
$return[] = $numbers;
-
}
-
-
$left++;
-
$right--;
-
}
-
}
-
}
-
-
return $return;
-
}
-
-
$arr = [-10, -9, -8, -4, -2, 0, 1, 2, 3, 4, 5, 6, 9];
-
var_dump(three_sum($arr));
-
>>> three_sum($arr)
-
=> [
-
"-10,1,9",
-
"-10,4,6",
-
"-10,5,5",
-
"-9,0,9",
-
"-9,3,6",
-
"-9,4,5",
-
"-8,2,6",
-
"-8,3,5",
-
"-8,4,4",
-
"-4,-2,6",
-
"-4,0,4",
-
"-4,1,3",
-
"-4,2,2",
-
"-2,0,2",
-
"-2,1,1",
-
]
任意n个正负整数里面最大的连续和
-
/**
-
* 获取最大的连续和
-
* @param array $arr
-
* @return int
-
*/
-
function max_sum_array($arr)
-
{
-
$currSum = 0;
-
$maxSum = 0;//数组元素全为负的情况,返回最大数
-
-
$n = count($arr);
-
-
for ($i = 0; $i < $n; $i++) {
-
if ($currSum >= 0) {
-
$currSum += $arr[$i];
-
} else {
-
$currSum = $arr[$i];
-
}
-
}
-
-
if ($currSum > $maxSum) {
-
$maxSum = $currSum;
-
}
-
-
return $maxSum;
-
}
-
>>> max_sum_array([1,6,2,3,8])
-
=> 20
HTTP中GET与POST的区别
-
GET在浏览器回退时是无害的,而POST会再次提交请求。
-
GET产生的URL地址可以被Bookmark,而POST不可以。
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
-
GET请求只能进行url编码,而POST支持多种编码方式。
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
-
GET请求在URL中传送的参数是有长度限制的,而POST没有。
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
-
GET参数通过URL传递,POST放在Request body中。
-
GET产生一个TCP数据包,POST产生两个TCP数据包。
COOKIE和SESSION的区别和关系
-
COOKIE保存在客户端,而SESSION则保存在服务器端
-
从安全性来讲,SESSION的安全性更高
-
从保存内容的类型的角度来讲,COOKIE只保存字符串(及能够自动转换成字符串)
-
从保存内容的大小来看,COOKIE保存的内容是有限的,比较小,而SESSION基本上没有这个限制
-
从性能的角度来讲,用SESSION的话,对服务器的压力会更大一些
-
SEEION依赖于COOKIE,但如果禁用COOKIE,也可以通过url传递
统计某一天网站的访问量
-
awk '{print $1}' /var/log/access.log | sort | uniq | wc -l
fastcgi通过端口监听和通过文件监听的区别
-
监听方式 形式 nginx链接fastcgi方式
-
端口监听 fastcgi_pass 127.0.0.1:9000 TCP链接
-
文件监听 fastcgi_pass /tmp/php_cgi.sock Unix domain Socket
Memcache与Redis的区别
-
Memcache
-
该产品本身特别是数据在内存里边的存储,如果服务器突然断电,则全部数据就会丢失
-
单个key(变量)存放的数据有1M的限制
-
存储数据的类型都是String字符串类型
-
本身没有持久化功能
-
可以使用多核(多线程)
-
Redis
-
数据类型比较丰富:String、List、Set、Sortedset、Hash
-
有持久化功能,可以把数据随时存储在磁盘上
-
本身有一定的计算功能
-
单个key(变量)存放的数据有1GB的限制
-
redis 内存不够,使用 bitset
多进程同时写一个文件的问题
-
function write($str)
-
{
-
$fp = fopen($file, 'a');
-
do {
-
usleep(100);
-
} while (!flock($fp, LOCK_EX));
-
fwrite($fp, $str . PHP_EOL);
-
flock($fp, LOCK_UN);
-
fclose($fp);
-
}
php7新特性
-
?? 运算符(NULL 合并运算符)
-
函数返回值类型声明
-
标量类型声明
-
use 批量声明
-
define 可以定义常量数组
-
闭包( Closure)增加了一个 call 方法
验证ip
-
function check_ip($ip)
-
{
-
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
-
return false;
-
} else {
-
return true;
-
}
-
}
验证日期是否合理
-
function check_datetime($datetime)
-
{
-
if (date('Y-m-d H:i:s', strtotime($datetime)) === $datetime) {
-
return true;
-
} else {
-
return false;
-
}
-
}
设计一个秒杀系统
-
$ttl = 4;
-
$random = mt_rand(1,1000).'-'.gettimeofday(true).'-'.mt_rand(1,1000);
-
-
$lock = fasle;
-
while (!$lock) {
-
$lock = $redis->set('lock', $random, array('nx', 'ex' => $ttl));
-
}
-
-
if ($redis->get('goods.num') <= 0) {
-
echo ("秒杀已经结束");
-
//删除锁
-
if ($redis->get('lock') == $random) {
-
$redis->del('lock');
-
}
-
return false;
-
}
-
-
$redis->decr('goods.num');
-
echo ("秒杀成功");
-
//删除锁
-
if ($redis->get('lock') == $random) {
-
$redis->del('lock');
-
}
-
return true;
给某个ip找到对应的省和市
-
//ip2long,把所有城市的最小和最大Ip录进去
-
$redis_key = 'ip';
-
$redis->zAdd($redis_key, 20, '#bj');//北京的最小IP加#
-
$resid->zAdd($redis_key, 30, 'bj');//最大IP
-
-
function get_ip_city($ip_address)
-
{
-
$ip = ip2long($ip_address);
-
-
$redis_key = 'ip';
-
$city = zRangeByScore($redis_key, $ip, '+inf', array('limit' => array(0, 1)));
-
if ($city) {
-
if (strpos($city[0], "#") === 0) {
-
echo '城市不存在!';
-
} else {
-
echo '城市是' . $city[0];
-
}
-
} else {
-
echo '城市不存在!';
-
}
-
}
网页/应用访问慢突然变慢,如何定位问题
-
top、iostat查看cpu、内存及io占用情况
-
内核、程序参数设置不合理 查看有没有报内核错误,连接数用户打开文件数这些有没有达到上限等等
-
链路本身慢 是否跨运营商、用户上下行带宽不够、dns解析慢、服务器内网广播风暴什么的
-
程序设计不合理 是否程序本身算法设计太差,数据库语句太过复杂或者刚上线了什么功能引起的
-
其它关联的程序引起的 如果要访问数据库,检查一下是否数据库访问慢
-
是否被***了 查看服务器是否被DDos了等等
-
硬件故障 这个一般直接服务器就挂了,而不是访问慢
分析apache日志获取最多访问的前10个IP
-
awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail
-
首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个。
-
以上参数可以略作修改显示更多的数据,比如将tail加上-n参数等,另外日志格式不同命令也可能需要稍作修改。
-
当前WEB服务器中联接次数最多的ip地址
-
#netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr
-
-
查看日志中访问次数最多的前10个IP
-
#cat access_log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 | less
-
-
查看日志中出现100次以上的IP
-
#cat access_log |cut -d ' ' -f 1 | sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr | less
-
-
查看最近访问量最高的文件
-
#cat access_log | tail -10000 | awk '{print $7}' | sort | uniq -c | sort -nr | less
-
-
查看日志中访问超过100次的页面
-
#cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
-
-
统计某url,一天的访问次数
-
#cat access_log | grep '12/Aug/2009' | grep '/images/index/e1.gif' | wc | awk '{print $1}'
-
-
前五天的访问次数最多的网页
-
#cat access_log | awk '{print $7}' | uniq -c | sort -n -r | head -20
-
-
从日志里查看该ip在干嘛
-
#cat access_log | grep 218.66.36.119 | awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less
-
-
列出传输时间超过 30 秒的文件
-
#cat access_log | awk '($NF > 30){print $7}' | sort -n | uniq -c | sort -nr | head -20
-
-
列出最最耗时的页面(超过60秒的)
-
#cat access_log | awk '($NF > 60 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -100
-
感谢
PHP技术大全https://zhuanlan.zhihu.com/phpgod
3年PHPer的面试总结http://coffeephp.com/articles/4
面试过阿里等互联网大公司,我知道了这些套路https://juejin.im/post/59bd64c4f265da066d33333d
前端面试题https://github.com/calabash519/interview-questions
Laravel、PHPer 面试可能会遇到的问题https://github.com/todayqq/caseInterviewQuestions https://github.com/justcodingnobb/fuck-php-interview https://zhuanlan.zhihu.com/p/2593665
https://www.v2ex.com/t/375266
这篇关于PHP 面试题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-19php8的协程和hyperf的协程有什么区别?-icode9专业技术文章分享
- 2024-12-19php8 的fiber是什么?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-11-29使用PHP 将ETH账户的资产汇集到一个账户
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享