PHP的文件操作与算法实现的面试题示例


Posted in PHP onAugust 10, 2015

操作文件

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

要求: dir/upload.image.jpg, 找出.jpg或者jpg

<?php 
  /** 
   * 五种方式获取指定路径的文件扩展名 
   */ 
   
  $str = "dir/upload.image.jpg"; 
   
  function one ($str) 
  { 
    $arr = explode('.', $str); 
    $count = count($arr); 
     
    return $arr[$count - 1]; 
  } 
   
  function two ($str) 
  { 
    $len = strlen($str); 
     
    for ($i = $len - 1, $name = ''; $str[$i] != '.'; $i --) { 
      $name .= $str[$i]; 
    } 
    $name = strrev($name); 
     
    return $name; 
  } 
   
  function three($str) 
  { 
    $path = pathinfo($str); 
     
    return $path['extension']; 
  }  
   
  function four($str) 
  { 
    $arr = explode('.', $str); 
     
    return array_pop($arr); 
  } 
   
  function five($str) 
  { 
    $start = strrpos($str, '.'); 
     
    return substr($str, $start + 1); 
  } 
   
  echo one($str); 
  echo "<br>"; 
   
  echo two($str); 
  echo "<br>"; 
   
  echo three($str); 
  echo "<br>"; 
   
  echo four($str); 
  echo "<br>"; 
   
  echo five($str); 
  echo "<br>";

2.写一个php函数算出两个文件的相对路径。例如$a="/a/b/c/d/e.php"; $b="/a/b/12/34/c.php",B相对于A的相对路径是什么?

这道题目可以看成是求第一个公共节点的题目,网上流传的代码大部分是错的,考虑不周全,当然我这个也只是用“../”去表示,没用"./"

 

<?php 
   
  /** 
   * 求$b相对于$a的相对路径 
   * @param string $a 
   * @param string $b 
   * @return string 
   */ 
  function getRelativePath ($a, $b) 
  { 
    $patha = explode('/', $a); 
    $pathb = explode('/', $b); 
     
    $counta = count($patha) - 1; 
    $countb = count($pathb) - 1; 
     
    $path = "../"; 
    if ($countb > $counta) { 
      while ($countb > $counta) { 
        $path .= "../"; 
        $countb --; 
      } 
    } 
     
    // 寻找第一个公共结点 
    for ($i = $countb - 1; $i >= 0;) { 
      if ($patha[$i] != $pathb[$i]) { 
        $path .= "../"; 
        $i --; 
      } else { // 判断是否为真正的第一个公共结点,防止出现子目录重名情况 
        for ($j = $i - 1, $flag = 1; $j >= 0; $j --) { 
          if ($patha[$j] == $pathb[$j]) { 
            continue; 
          } else { 
            $flag = 0; 
            break; 
          } 
        } 
         
        if ($flag) 
          break; 
        else 
          $i ++; 
      } 
    } 
     
    for ($i += 1; $i <= $counta; $i ++) { 
      $path .= $patha[$i] . "/"; 
    } 
     
    return $path; 
  } 
   
  $a = "/a/c/d/e.php"; 
  $b = "/a/c.php"; 
   
  $path = getRelativePath($a, $b); 
  echo $path;

算法

1.使用PHP描述冒泡排序和快速排序,对象可以是一个数组

<?php 
   
  /** 
   * 冒泡排序算法实现(从小到大) 
   */ 
  function maopaoSort (&$array) 
  { 
    $count = count($array); 
     
    for ($i = 0; $i < $count - 1; $i ++) { 
      for ($j = 0; $j < $count - $i - 1; $j ++) { 
        if ($array[$j] > $array[$j + 1]) { 
          $tmp = $array[$j]; 
          $array[$j] = $array[$j + 1]; 
          $array[$j + 1] = $tmp; 
        } 
      } 
    } 
  } 
   
  /** 
   * 快速排序 
   */ 
  function pivotParation (&$array, $start, $end) 
  { 
    $stand = $array[$start]; 
     
    while ($start < $end) { 
      while ($start < $end && $array[$end] >= $stand) { 
        $end --; 
      } 
      if ($start < $end) { 
        $array[$start ++] = $array[$end]; 
      } 
       
      while ($start < $end && $array[$start] <= $stand) { 
        $start ++; 
      } 
      if ($start < $end) { 
        $array[$end --] = $array[$start]; 
      } 
    } 
     
    $array[$start] = $stand; 
     
    return $start; 
  } 
   
  function quickSort (&$array, $begin, $end) 
  { 
    if ($begin < $end) { 
      $pivot = pivotParation($array, $begin, $end); 
      quickSort($array, $begin, $pivot - 1); 
      quickSort($array, $pivot + 1, $end); 
    } 
  } 
   
  $arr = array( 
      5, 
      1, 
      3, 
      2, 
      19, 
      11, 
      25, 
      12, 
      100, 
      10000, 
      12 
  ); 
   
  // 冒泡排序 
  maopaoSort($arr); 
  print_r($arr); 
  echo "<br>"; 
   
  // 快速排序 
  $count = count($arr); 
  quickSort($arr, 0, $count - 1); 
  print_r($arr);

2.使用php描述顺序查找和二分查找

<?php 
   
  /** 
   * 顺序查找 
   */ 
  function seqSearch ($arr, $needle) 
  { 
    for ($i = 0, $len = count($arr); $i < $len; $i ++) { 
      if ($arr[$i] == $needle) { 
        return $i; 
      } 
    } 
    return - 1; 
  } 
   
  /** 
   * 二分查找 
   */ 
  function midSearch ($arr, $start, $end, $needle) 
  { 
    while ($start <= $end) { 
      $mid = (int)($start + ($end - $start) / 2); // 防止超出整数表示范围 
       
      if ($arr[$mid] == $needle) { 
        return $mid; 
      } else if ($arr[$mid] > $needle) { 
        $end = $mid - 1; 
      } else { 
        $start = $mid + 1; 
      } 
    } 
     
    return - 1; 
  } 
   
  $arr = array( 
      1, 
      2, 
      3, 
      4, 
      5, 
      6, 
      7, 
      8, 
      9, 
      10 
  ); 
   
  $needle = 5; 
   
  echo seqSearch($arr, $needle); 
  echo "<br>"; 
   
  echo midSearch($arr, 0, count($arr) - 1, $needle);

3.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

/** 
   * Description:获取中枢点的位置 
   * 
   * @param array $array       
   * @param int $left       
   * @param int $right       
   * @param string $field       
   * @return int 
   */ 
  function fetchArrayPivot (&$array, $left, $right, $field) 
  { 
    // 基准定义 
    $stand = $array[$left]; 
     
    // 遍历数组 
    while ($left < $right) { 
      while ($left < $right && $array[$right][$field] >= $stand[$field]) { 
        $right --; 
      } 
      if ($left < $right) { 
        $array[$left ++] = $array[$right]; 
      } 
       
      while ($left < $right && $array[$left][$field] <= $stand[$field]) { 
        $left ++; 
      } 
      if ($left < $right) { 
        $array[$right --] = $array[$left]; 
      } 
    } 
     
    // 获取中枢点位置 
    $array[$left] = $stand; 
     
    return $left; 
  } 
   
  /** 
   * Description:快速排序主程序 
   * 
   * @param array $array       
   * @param int $begin       
   * @param int $end       
   * @param string $field       
   */ 
  function quickSort (&$array, $begin, $end, $field) 
  { 
    // 变量定义 
    $pivot = null; 
     
    if ($begin < $end) { 
      $pivot = fetchArrayPivot($array, $begin, $end, $field); 
      quickSort($array, $begin, $pivot - 1, $field); 
      quickSort($array, $pivot + 1, $end, $field); 
    } 
  }

利用快排的思想,增加一个field参数

PHP 相关文章推荐
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
php 图片上传类代码
Jul 17 PHP
php 处理上百万条的数据库如何提高处理查询速度
Feb 08 PHP
Apache 配置详解(最好的APACHE配置教程)
Jul 04 PHP
解析PHP自带的进位制之间的转换函数
Jun 08 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
Yii视图操作之自定义分页实现方法
Jul 14 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 PHP
PHP-X系列教程之内置函数的使用示例
Oct 16 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
PHP之多条件混合筛选功能的实现方法
Oct 09 PHP
PHP的关于变量和日期处理的一些面试题目整理
Aug 10 #PHP
6个超实用的PHP代码片段
Aug 10 #PHP
解读PHP中的垃圾回收机制
Aug 10 #PHP
php实现多城市切换特效
Aug 09 #PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 #PHP
PHP实现获取文件后缀名的几种常用方法
Aug 08 #PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 #PHP
You might like
smarty实例教程
2006/11/19 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
php源码的使用方法讲解
2019/09/26 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
python检测某个变量是否有定义的方法
2015/05/20 Python
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
python黑魔法之编码转换
2016/01/25 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
浅谈django 重载str 方法
2020/05/19 Python
python实现代码审查自动回复消息
2021/02/01 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
中国好声音华少广告词
2014/03/17 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
担保贷款承诺书
2015/04/30 职场文书
企业百日安全活动总结
2015/05/07 职场文书
公司保洁员管理制度
2015/08/04 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android