PHP高级面试题

1.写出一个能创建多级目录的PHP函数

      function createdir($path,$mode){
             if (is_dir($path)){  //判断目录存在否,存在不创建
                      echo “目录'” . $path . “‘已经存在”;
              }else{ //不存在创建
                          $re=mkdir($path,$mode,true); //第三个参数为true即可以创建多极目录
                         if ($re){
                                 echo “目录创建成功”;
                         }else{
                                 echo “目录创建失败”;
                         }
                 }
         }
         $path=”/aa/bb/cc/cd”; //要创建的目录
     $mode=0755; //创建目录的模式
     createdir($path,$mode);//测试
 

2.请写一段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);

3.
写一个函数,能够遍历一个文件夹下的所有文件和子文件夹

    function my_scandir($dir){
        $files = array();
        if(is_dir($dir)){
            if ($handle = opendir($dir)) {
                while (($flie = readdir($handle))!== false) {
                    if ($flie!="." && $file!="..") {
                        if (is_dir($dir."/".$file)) {
                            $files[$file] = my_scandir($dir."/".$file);
                        } else {
                            $files[] = $dir."/".$file;
                        }
                    }
                }
                closedir($handle);
                return $files;
            }
        }
    }

4.简述论坛中无限分类的实现原理

创建类别表如下:

CREATETABLEcategory(

cat_id smallint unsigned not null auto_increment primary key comment'类别ID',
cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'类别名称',
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'类别父ID'
)engine=MyISAM 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;
    }

5.请写一个函数验证电子邮件的格式是否正确(要求使用正则)(新浪)

preg_match('/^[\w\-\.][email protected][\w\-]+(\.\w+)+$/',$email);

6.编写函数取得上一月的最后一天

    /** * 获取给定月份的上一月最后一天 * @param $date string 给定日期 * @return string 上一月最后一天 */
    function get_last_month_last_day($date = ''){
        if ($date != '') {
            $time = strtotime($date);
        } else {
            $time = time();
        }
        $day = date('j',$time);//获取该日期是当前月的第几天
        return date('Y-m-d',strtotime("-{$day} days",$time));
    }

    // 测试
    echo get_last_month_last_day();
    echo "<br />";
    echo get_last_month_last_day("2013-3-21");

7.
如果我的网站用的utf-8编码,为防止乱码出现,都需要注意哪些地方?

从以下几个方面考虑:

  1. 数据库中库和表都用utf8编码
  2. php连接mysql,指定数据库编码为utf8  mysql_query(“set names utf8”);
  3. php文件指定头部编码为utf-8 header(“content-type:text/html;charset=utf-8”);
  4. 网站下所有文件的编码为utf8
  5. html文件指定编码为utf-8 <meta http-equiv="Content-Type"content="text/html;charset=utf-8"/>

8.使用五种以上方式获取一个文件的扩展名

方法1:

$string= 'dir/upload.image.jpg'; 
$i= strrpos($string, '.');   //得到指定分割符在字符串的最后一次出现的位置 
$file_type= substr($string, $i);//截取字符串 

方法2:
$string= 'dir/upload.image.jpg'; 
$arr= pathinfo($string);  //返回文件路径的信息    print_r($arr); 
$file_type= $arr['extension']; 

9.一羣猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。(新浪)(小米)

 
 // 方案一,使用php来模拟这个过程
    function king($n,$m){
        $mokey = range(1, $n);
        $i = 0;

        while (count($mokey) >1) {
            $i += 1;
            $head = array_shift($mokey);//一个个出列最前面的猴子
            if ($i % $m !=0) {
                #如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
                array_push($mokey,$head);
            }
            // 剩下的最后一个就是大王了
            return $mokey[0];
        }
    }


点赞