php面试题汇集2
1、实现中文字符串截取无乱码方法
开启mbstring扩展,然后自定义函数:
- <?php
- header('content-Type:text/html:charset=utf-8');
- function substr_utf8($str, $start, $length = null) {
- return join("",
- array_slice(
- preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $start, $length)
- );
- }
- //实例
- $str = "我是一个good男孩!";
- echo substr_utf8($str, 2, 4);
2、用PHP打印前一天的时间
- <?php
- header('content-Type:text/html:charset=utf-8');
- echo date('Y-m-d H:i:s',strtotime('-1 day'));
3、不适用第三个变量交换2个变量的值
- <?php
- header('content-Type:text/html:charset=utf-8');
- $a = 'a';
- $b = 'b';
- list($a,$b) = array($b,$a);
- echo $a,$b;
4、将1234567890,转换成1,234,567,890
- header('content-Type:text/html:charset=utf-8');
- $str = '1234567890';
- //反转字符串
- $str = strrev($str);
- //使用逗号分隔得到098,765,432,1,
- $str = chunk_split($str,3,',');
- //再次反转
- $str = strrev($str);
- //去掉左边的,
- $str = ltrim($str,',');
- echo $str;
5、实现utf8字符串反转
不能使用strrev,中文会出错
- function strrev_utf8($str){
- return join("",array_reverse(preg_split("//u",$str)));
- }
- $str = "我是一个good男孩";
- echo strrev_utf8($str);
6、取url的文件扩展名,尽量多的去实现方法
- $str = "www.baidu.com/index.php";
- function get_ext1($str){
- return strrchr($str,'.');
- }
- function get_ext2($str){
- return substr($str,strrpos($str,'.'));
- }
- function get_ext3($str){
- $str = pathinfo($str);
- return $str['extension'];
- }
- function get_ext4($str){
- $arr = explode('.',$str);
- return $arr[count($arr)-1];
- }
- function get_ext5($str){
- $pattern = '/^[^\.]+\.([\w]+)$/';
- return preg_replace($pattern,'${1}',basename($str));
- }
7、写一个函数,将字符串open_door转换为OpenDoor
- $str = "open_door";
- function change_str($str){
- $arr = explode('_',$str);
- $arr = array_map('ucfirst',$arr);
- return implode('',$arr);
- }
- echo change_str($str);
8、单例模式
- <?php
- class Mysql{
- private static $instance = null;
- private $conn;
- //设置为私有,不允许通过new获得对象
- private function __construct(){
- $conn = mysql_connect('localhost','root','123456');
- }
- //获取实例方法
- public static function getInstance(){
- if(! self::$instance instanceof self){
- self::$instance = new self;
- }
- return self::$instance;
- }
- //禁止克隆
- private function __clone(){}
- }
- $db = Mysql::getInstance();
9、写一段PHP代码,确保多个进程同时写入同一个文件成功
- <?php
- $fp = fopen("lock.txt","w+");
- if(flock($fp,LOCK_EX)){
- //获得写锁
- fwrite($fp,'write something');
- flock($fp,LOCK_UN);
- }else{
- echo "file is locking...";
- }
- fclose($fp);
10、从一个完成的url获取文件扩展名
- <?php
- $url = 'http://www.baidu.com/a/b/index.php?id=1';
- $arr = parse_url($url);
- $fname = basename($arr['path']);
- $arr = explode('.',$fname);
- echo $arr[count($arr)-1];
11、写一个函数可以便利一个文件夹下的所有文件和子文件夹
- <?php
- function my_scandir($dir){
- $files = array();
- if(is_dir($dir)){
- if($handle = opendir($dir)){
- while(($file = readdir($handle)) !== false){
- if($file != "." && $file != ".."){
- if(is_dir($dir.'/'.$file)){
- $files[$file] = my_scandir($dir.'/'.$file);
- }else{
- $files[] = $dir.'/'.$file;
- }
- }
- }
- closedir($handle);
- return $files;
- }
- }
- }
- var_dump(my_scandir('D:\wamp\www\study'));
12、论坛中无限分类实现原理
首先设计数据库表
- create table category(
- cate_id int unsigned not null auto_increment primary key,
- cat_name varchar(30) not null default '',
- parent_id int unsigned not null default 0
- ) engine=innodb charset=utf8;
然后用函数去递归实现,无限分类
- function tree($arr,$pid=0,$level=0){
- static $list = array();
- foreach($arr as $v){
- //如果是顶级分类,则存入$list
- //然后以此节点为根几点,遍历其子节点
- if($v['parent_id'] == $pid){
- $v['level'] = $level;
- $list[] = $v;
- tree($arr,$v['cat_id'],$level+1);
- }
- }
- return $list;
- }
13、计算2个文件的相对路径
- <?php
- $a = '/a/b/c/d/a.php';
- $b = '/a/b/e/f/b.php';
- $arr1 = explode('/',dirname($a));
- $arr2 = explode('/',dirname($b));
- for($i=0,$len=count($arr2);$i<$len;$i++){
- if($arr1[$i] != $arr2[$i]){
- break;
- }
- }
- //不在用一个根目录
- if($i == 1){
- $ret = array();
- }
- //在同一个根目录下
- if($i != 1 && $i < $len){
- $ret = array_fill(0,$len-$i,"..");
- }
- //在同一个目录下
- if($i == $len){
- $ret = array('./');
- }
- $ret = array_merge($ret,array_slice($arr1,$i));
- echo implode('/',$ret);
14、约瑟夫环问题
- <?php
- function king($n,$m){
- $monkey = range(1,$n);
- $i = 0;
- while(count($monkey) > 1){
- $i += 1;
- $head = array_shift($monkey);//一个个出列最前面的
- if( $i % $m != 0){
- //如果不是m的倍数,则返回尾部,否则就出列了
- array_push($monkey,$head);
- }
- }
- return $monkey[0];
- }
- echo king(10,7);
15、PHP实现双向队列
- <?php
- class Dqueue{
- private $queue = array();
- public function addFirst($item){
- return array_unshift($this->queue,$item);
- }
- public function addLast($item){
- return array_push($this->queue,$item);
- }
- public function getFirst(){
- return array_shift($this->queue);
- }
- public function getLast(){
- return array_pop($this->queue);
- }
- }
php面试题汇集2的更多相关文章
- C++面试题汇集
1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以 ...
- Android面试题集合
https://www.jianshu.com/p/718aa3c1a70b https://www.jianshu.com/p/2dd855aa1938 https://www.jianshu.co ...
- 2019年阿里java面试题
一.JVM与性能优化 描述一下 JVM 加载 Class 文件的原理机制? 什么是类加载器? 类加载器有哪些? 什么是tomcat类加载机制? 类加载器双亲委派模型机制? Java 内存分配? Jav ...
- 反应器模式 vs 观察者模式
反应器模式(Reactor pattern)与观察者模式(Observer pattern) 反应器模式 是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式.当请求抵达后,服务处理程 ...
- 反应器模式 vs 生产者消费者模式
相似点: 从结构上,反应器模式有点类似生产者消费者模式,即有一个或多个生产者将事件放入一个Queue中,而一个或多个消费者主动的从这个Queue中Poll事件来处理: 不同点: Reactor模式则并 ...
- Pipeline inbound(netty源码7)
netty源码死磕7 Pipeline 入站流程详解 1. Pipeline的入站流程 在讲解入站处理流程前,先脑补和铺垫一下两个知识点: (1)如何向Pipeline添加一个Handler节点 ( ...
- 一道常被人轻视的前端JS面试题
前言 年前刚刚离职了,分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多 ...
- JavaScript面试题
一道常被人轻视的前端JS面试题 标签(空格分隔): JavaScript function Foo() { getName = function () { alert (1); }; return t ...
- 一道常被人轻视的前端JS面试题(转)
分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多难只是因为大多面试者过 ...
随机推荐
- 利用jekyll架设个人博客
jekyll简介 jekyll是一种可以将Markdown或Textile格式文本文件转换成静态网页的工具.利用jekyll编写发布博客的基本过程为: 使用任何一款编辑器编写符合Markdown或Te ...
- 使用RampTexture来控制diffuse shading
[RampTexture] RampTexture(渐变纹理),可以是1D/2D纹理. This allows you to accentuate the surface's colors to fa ...
- Oracle 下基于 DBMS_RESOURCE_MANAGER 包估算数据库存储 IO 性能
:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...
- Android中自定义ListView实现上拉加载更多和下拉刷新
ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,Gi ...
- unity3d xml序列化
using UnityEngine; using System.Collections; using System.Xml; using System.Xml.Serialization; using ...
- Win10 提升系统响应速度
转载百度经验: https://jingyan.baidu.com/article/54b6b9c0e9d61e2d583b4719.html 1.鼠标左键点击开始按钮,然后点击菜单中的设置,进入设置 ...
- 670. Maximum Swap 允许交换一个数 求最大值
[抄题]: Given a non-negative integer, you could swap two digits at most once to get the maximum valued ...
- ProxyPattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...
- PollingProvider方法的使用及示例
来自<sencha touch权威指南>第12章,374页开始 ----------------------------------------------------- PollingP ...
- 使用OpenSSL进行转换
使用OpenSSL进行转换 摘自:https://cloud.tencent.com/developer/ask/29886 这些命令允许您将证书和密钥转换为不同的格式,以使它们与特定类型的服务器或软 ...