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的更多相关文章

  1. C++面试题汇集

    1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以 ...

  2. Android面试题集合

    https://www.jianshu.com/p/718aa3c1a70b https://www.jianshu.com/p/2dd855aa1938 https://www.jianshu.co ...

  3. 2019年阿里java面试题

    一.JVM与性能优化 描述一下 JVM 加载 Class 文件的原理机制? 什么是类加载器? 类加载器有哪些? 什么是tomcat类加载机制? 类加载器双亲委派模型机制? Java 内存分配? Jav ...

  4. 反应器模式 vs 观察者模式

    反应器模式(Reactor pattern)与观察者模式(Observer pattern) 反应器模式 是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式.当请求抵达后,服务处理程 ...

  5. 反应器模式 vs 生产者消费者模式

    相似点: 从结构上,反应器模式有点类似生产者消费者模式,即有一个或多个生产者将事件放入一个Queue中,而一个或多个消费者主动的从这个Queue中Poll事件来处理: 不同点: Reactor模式则并 ...

  6. Pipeline inbound(netty源码7)

    netty源码死磕7  Pipeline 入站流程详解 1. Pipeline的入站流程 在讲解入站处理流程前,先脑补和铺垫一下两个知识点: (1)如何向Pipeline添加一个Handler节点 ( ...

  7. 一道常被人轻视的前端JS面试题

    前言 年前刚刚离职了,分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多 ...

  8. JavaScript面试题

    一道常被人轻视的前端JS面试题 标签(空格分隔): JavaScript function Foo() { getName = function () { alert (1); }; return t ...

  9. 一道常被人轻视的前端JS面试题(转)

    分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多难只是因为大多面试者过 ...

随机推荐

  1. zfs mount

    root@47abd5c91421:/# ls /native/sbin    autopush  cryptoadm  dhcpinfo  dlstat       flowadm     ibd_ ...

  2. linux进阶与hadoop

    Linux进阶命令: find .  | ls --help | more  grep ll | grep 1.txt   grep -ri  BASH 1.txt   grep -ri BASH   ...

  3. 201671010127 2016-2017-11 Java图形用户界面设计技术

    一.事件处理器 1.什么是事件处理 一个事件要求特定的动作被执行,它被作为消息由外界或系统自身发送给GUI系统.这些事件包括来自计算机设备如鼠标键盘和网络端口的I/O中断,以及GUI系统的逻辑事件触发 ...

  4. Spark之 Spark Streaming整合kafka(并演示reduceByKeyAndWindow、updateStateByKey算子使用)

    Kafka0.8版本基于receiver接受器去接受kafka topic中的数据(并演示reduceByKeyAndWindow的使用) 依赖 <dependency> <grou ...

  5. css3中的transform、transition、translate、animation(@keyframes)的区别

    一.前言 在CSS中,我们经常会使用到transform.transition.translate.animation(@keyframes)这些长得相似,又不好区分的属性(值).每当需要使用它们,都 ...

  6. cs4.1 编译与安装

    cs4.1编译报 https://issues.apache.org/jira/browse/CLOUDSTACK-2913 cs4.1安装报

  7. python实现高效率的排列组合算法-乾颐堂

    组合算法 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标 代表的数被选中,为0则没选中. 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数. 然后从左到右扫描数组 ...

  8. 白盒测试实践-任务进度-Day03

    所使用静态代码检查工具 阿里巴巴Java开发代码检测IDE插件 小组成员 华同学.郭同学.覃同学.刘同学.穆同学.沈同学 任务进度 经过前期的学习和会议筹备,今天我们小组召开了代码评审会议.以下是今天 ...

  9. 开发高性能的MongoDB应用—浅谈MongoDB性能优化(转)

    出处:http://www.cnblogs.com/mokafamily/p/4102829.html 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往 ...

  10. yii2 Html::a

    Html::a($text,$url = null,$options = []) $url 可以直接是字符串 // An empty string. This will return the curr ...