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 相关文章推荐
实用函数10
Nov 08 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
php中的字符编码转换函数用法示例
Oct 20 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
Jan 12 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
PHP房贷计算器实例代码,等额本息,等额本金
Apr 01 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
Jun 05 PHP
PHP大文件切割上传并带进度条功能示例
Jul 01 PHP
用php如何解决大文件分片上传问题
Jul 07 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
mysql中存储过程、函数的一些问题
2007/02/14 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
php简单压缩css样式示例
2016/09/22 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
深入浅析vue组件间事件传递
2017/12/29 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python解析文件示例
2014/01/23 Python
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
Python实现控制台输入密码的方法
2015/05/29 Python
Python实现建立SSH连接的方法
2015/06/03 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
python 实现控制鼠标键盘
2020/11/27 Python
C#笔试题
2015/07/14 面试题
员工自我鉴定范文
2013/10/06 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
内科护士节演讲稿
2014/09/11 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技