php教程

超轻量级php框架startmvc

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

更新时间:2020-03-05 13:01:09 作者:startmvc
操作文件1.使用5种以上的方式获取一个文件的扩展名要求:dir/upload.image.jpg,找出.jpg或者jpg<

操作文件

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 文件 算法