PHP 面试题

PHP 面试题,第1张

概述明天就双十一了,准备好剁手了吗?我是没什么买的了,今天给大家推荐一些PHP面试题。反转函数的实现/***反转数组*@param array$arr*@returnarray*/functionreverse($arr){  $n=count($arr);   $left=0;  $right=$n-1;

明天就双十一了,准备好剁手了吗?我是没什么买的了,今天给大家推荐一些 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 面试题全部内容,希望文章能够帮你解决PHP 面试题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1000495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存