PHP的文件操作与算法实现的面试题示例
操作文件
1.使用5种以上的方式获取一个文件的扩展名
要求:dir/upload.image.jpg,找出.jpg或者jpg
<?php
/**
*五种方式获取指定路径的文件扩展名
*/
$str="dir/upload.image.jpg";
functionone($str)
{
$arr=explode('.',$str);
$count=count($arr);
return$arr[$count-1];
}
functiontwo($str)
{
$len=strlen($str);
for($i=$len-1,$name='';$str[$i]!='.';$i--){
$name.=$str[$i];
}
$name=strrev($name);
return$name;
}
functionthree($str)
{
$path=pathinfo($str);
return$path['extension'];
}
functionfour($str)
{
$arr=explode('.',$str);
returnarray_pop($arr);
}
functionfive($str)
{
$start=strrpos($str,'.');
returnsubstr($str,$start+1);
}
echoone($str);
echo"<br>";
echotwo($str);
echo"<br>";
echothree($str);
echo"<br>";
echofour($str);
echo"<br>";
echofive($str);
echo"<br>";
2.写一个php函数算出两个文件的相对路径。例如$a="/a/b/c/d/e.php";$b="/a/b/12/34/c.php",B相对于A的相对路径是什么?
这道题目可以看成是求第一个公共节点的题目,网上流传的代码大部分是错的,考虑不周全,当然我这个也只是用“../”去表示,没用"./"
<?php
/**
*求$b相对于$a的相对路径
*@paramstring$a
*@paramstring$b
*@returnstring
*/
functiongetRelativePath($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
/**
*冒泡排序算法实现(从小到大)
*/
functionmaopaoSort(&$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;
}
}
}
}
/**
*快速排序
*/
functionpivotParation(&$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;
}
functionquickSort(&$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
/**
*顺序查找
*/
functionseqSearch($arr,$needle)
{
for($i=0,$len=count($arr);$i<$len;$i++){
if($arr[$i]==$needle){
return$i;
}
}
return-1;
}
/**
*二分查找
*/
functionmidSearch($arr,$start,$end,$needle)
{
while($start<=$end){
$mid=(int)($start+($end-$start)/2);//防止超出整数表示范围
if($arr[$mid]==$needle){
return$mid;
}elseif($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;
echoseqSearch($arr,$needle);
echo"<br>";
echomidSearch($arr,0,count($arr)-1,$needle);
3.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
/**
*Description:获取中枢点的位置
*
*@paramarray$array
*@paramint$left
*@paramint$right
*@paramstring$field
*@returnint
*/
functionfetchArrayPivot(&$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:快速排序主程序
*
*@paramarray$array
*@paramint$begin
*@paramint$end
*@paramstring$field
*/
functionquickSort(&$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参数