Home > Backend Development > PHP Tutorial > PHP技术人员-口试总结PHP篇

PHP技术人员-口试总结PHP篇

WBOY
Release: 2016-06-13 12:34:37
Original
836 people have browsed it

PHP技术人员--面试总结PHP篇
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)
);
}
//实例 (PS:^_^不错的php学习交流群:276167802,验证:csl,有兴趣的话可以加入进来一起讨论)
$str = "我是一个good男孩!";
echo substr_utf8($str, 2, 4);
Copy after login


2、用PHP打印前一天的时间


<?php header('content-Type:text/html:charset=utf-8');
echo date('Y-m-d H:i:s',strtotime('-1 day'));
Copy after login


3、不适用第三个变量交换2个变量的值


<?php header('content-Type:text/html:charset=utf-8');
$a = 'a';
$b = 'b';
list($a,$b) = array($b,$a);
echo $a,$b;
Copy after login


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;
Copy after login


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));
}
Copy after login


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);
Copy after login


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&#43;");
if(flock($fp,LOCK_EX)){
//获得写锁
fwrite($fp,'write something');
flock($fp,LOCK_UN);
}else{
echo "file is locking...";
}
fclose($fp);
Copy after login


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];
Copy after login


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'));
Copy after login


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;
}
Copy after login


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&#43;&#43;){
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);
Copy after login


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);
}
} 
Copy after login

希望本文对广大php开发者有所帮助,感谢阅读本文。
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template