分类 php 下的文章

计算字符串的不同

//检测字符串相同的部分
function check_str($str1,$str2){
    static $str_length_flag=1000000000;
    static $flag=0;

    $tmp_str1=$str1;$tmp_str2=$str2;
    $strlen=utf8_strlen($str1);
    $str_temp='';
    for ($i=0; $i <$strlen ; $i++) {
        for ($j=utf8_strlen($str_temp)+1; $j <=$strlen-$i ; $j++) 
        {
            //$j=$str_temp?utf8_strlen($str_temp):$j;
            $str_1=mb_substr($str1, $i, $j, 'utf-8');
            $str_start=strpos($str2, $str_1);
            if (!($str_start===false)) {
                if(strlen($str_1)>strlen($str_temp)){
                    $str_temp=$str_1;
                    $ex_info=array(
                        'str1_left'=>$i,
                        'str1_right'=>$j,
                        'str2_left'=>$str_start,
                        'str2_right'=>$str_start+strlen($str_temp),
                    );
                }
                if(utf8_strlen($str_1)>=utf8_strlen($str1)||utf8_strlen($str_1)>$str_length_flag){
                    break 2;
                }
            }else{
                break;
            }
        }
    }
    if (!$flag) {
        $str_length_flag=utf8_strlen($str_temp);
        $flag=1;
    }
    $res_arr=array();
    if (isset($ex_info)) {
        $str1_left_str=mb_substr($str1, 0, $ex_info['str1_left'], 'utf-8');
        $str2_left_str=substr($str2,0,$ex_info['str2_left']);
        if ($str1_left_str&&$str2_left_str) {
            $strleft=check_str($str1_left_str,$str2_left_str);
            if ($strleft) {
                $res_arr=array_merge($res_arr,$strleft);
            }
        }
        if ($str_temp) 
        {
            $res_arr=array_merge($res_arr,array($str_temp));
        }


        $str1_right_str=mb_substr($str1, $ex_info['str1_left']+$ex_info['str1_right'], utf8_strlen($str1), 'utf-8');
        $str2_right_str=substr($str2,$ex_info['str2_right'],strlen($str2));
        if ($str1_right_str&&$str2_right_str) 
        {
            $strright=check_str($str1_right_str,$str2_right_str);
            if ($strright) {

                $res_arr=array_merge($res_arr,$strright);

            }
        }
    }
    return $res_arr;

}
//改变样式
function str_color($str1,$str2,$arr){
    foreach ($arr as $key => $value) {
        $start1=strpos($str1,$value);
        $str1=substr_replace($str1, '---$'.$key.'$', $start1,strlen($value));
        $start2=strpos($str2,$value);
        $str2=substr_replace($str2, '---', $start2,strlen($value));
    }
    $arr1_temp=explode('---', $str1);
    $arr2_temp=explode('---', $str2);
    $temp_arr=array();
    foreach ($arr1_temp as $key => $value) {
        $check=preg_replace('/^\$(\d+)\$$/', '', $value);
        if (strlen($check)&&strlen($arr2_temp[$key])) {
            $temp_arr[]='<del>'.$arr2_temp[$key].'</del>'.'<ins color="greed">'.$value.'</ins>';//修改
        }elseif(strlen($check)){
            $temp_arr[]='<ins color="greed">'.$value.'</ins>';//新加的
        }elseif(strlen($arr2_temp[$key])){
            $temp_arr[]='<del>'.$value.$arr2_temp[$key].'</del>';//删除的
        }else {
            $temp_arr[]=$value;
        }
    }
    $temp_arr=preg_replace_callback('/(.*)(\$(\d+)\$)(.*)/', function ($matchs) use($arr){
        return $arr[$matchs[3]].$matchs[1].$matchs[4];
    }, $temp_arr);
    return implode('', $temp_arr);
}
$str1='我叫小明';
        $str2='我的名字是小明';
        echo "
        <style>
ins{
text-decoration: none;
padding: 3px 0;
background:
 #EAF0DD;
color: #5B7918;
}
del{text-decoration: line-through;
padding: 3px 0;
background: #f5dfdf;
color: #ac1414;}
        </style>
        ";
        echo(str_color($str2,$str1,check_str($str1,$str2)));

php面试常见算法

一、常见字符串和文件操作

1、PHP翻转中文字符串

function reverse($str){
    $r = array();
    for($i=0; $i<mb_strlen($str); $i++){
        $r[] = mb_substr($str, $i, 1, 'UTF-8');
    }
    return implode(array_reverse($r));
}
echo reverse('www.phpha.com天涯PHP博客');
//结果:'客博PHP涯天moc.ahphp.wwww'

2、PHP计算URL的文件后缀名

function getext($url){
    $data = parse_url($url);
    $path = $data['path'];
    $info = pathinfo($path);
    return $info['extension'];
}
echo getext('http://blog.phpha.com/archives/1670.html?id=1670');

//结果:'html'
3、PHP计算两个文件的相对路径

function getrpath($path, $conpath){
    $pathArr = explode('/', $path);
    $conpathArr = explode('/', $conpath);
    $dismatchlen = 0;
    for($i=0; $i<count($pathArr); $i++){
        if($conpathArr[$i] != $pathArr[$i]){
            $dismatchlen = count($pathArr) - $i;
            $arrleft = array_slice($pathArr, $i);
            break;
        }
    }
    return str_repeat('../', $dismatchlen).implode('/', $arrleft);
}
$a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/5.php';
echo getrpath($a, $b);
//结果:'../../../c/d/e.php'

4、PHP遍历目录下的所有文件和文件夹

function finddir($dir){
    $files = array();
    if(is_dir($dir)){
        if($handle = opendir($dir)){
            while(($file = readdir($handle)) !== false){
                if($file != '.' && $file != '..'){
                    if(is_dir(rtrim($dir, '/').'/'.$file)){
                        $files[$file] = finddir(rtrim($dir, '/').'/'.$file);
                    }else{
                        $files[] = rtrim($dir, '/').'/'.$file;
                    }
                }
            }
            closedir($handle);
        }
    }
    return $files;
}
print_r(finddir('F:/Golang/src'));
//结果:
Array
(
    [0] => F:/Golang/src/hello.go
    [1] => F:/Golang/src/src.exe
    [test] => Array
        (
            [0] => F:/Golang/src/test/sss.txt
        )

)

二、常见算法的实现

1、冒泡排序

function bubble_sort($arr) {
    $n=count($arr);
    for($i=0;$i<$n-1;$i++){
        for($j=$i+1;$j<$n;$j++) {
            if($arr[$j]<$arr[$i]) {
                $temp=$arr[$i];
                $arr[$i]=$arr[$j];
                $arr[$j]=$temp;
            }
        }
    }
    return $arr;
}

2、归并排序

function Merge(&$arr, $left, $mid, $right) {
  $i = $left;
  $j = $mid + 1;
  $k = 0;
  $temp = array();
  while ($i <= $mid && $j <= $right)
  {
    if ($arr[$i] <= $arr[$j])
      $temp[$k++] = $arr[$i++];
    else
      $temp[$k++] = $arr[$j++];
  }
  while ($i <= $mid)
    $temp[$k++] = $arr[$i++];
  while ($j <= $right)
    $temp[$k++] = $arr[$j++];
  for ($i = $left, $j = 0; $i <= $right; $i++, $j++)
    $arr[$i] = $temp[$j];
}

function MergeSort(&$arr, $left, $right)
{
  if ($left < $right)
  {
    $mid = floor(($left + $right) / 2);
    MergeSort($arr, $left, $mid);
    MergeSort($arr, $mid + 1, $right);
    Merge($arr, $left, $mid, $right);
  }
}

3、二分查找-递归

function bin_search($arr,$low,$high,$value) {
    if($low>$high)
        return false;
    else {
        $mid=floor(($low+$high)/2);
        if($value==$arr[$mid])
            return $mid;
        elseif($value<$arr[$mid])
            return bin_search($arr,$low,$mid-1,$value);
        else
            return bin_search($arr,$mid+1,$high,$value);
    }
}

4、二分查找-非递归

function bin_search($arr,$low,$high,$value) {
    while($low<=$high) {
        $mid=floor(($low+$high)/2);
        if($value==$arr[$mid])
            return $mid;
        elseif($value<$arr[$mid])
            $high=$mid-1;
        else
            $low=$mid+1;
    }
    return false;
}

5、快速排序

function quick_sort($arr) {
    $n=count($arr);
    if($n<=1)
        return $arr;
    $key=$arr[0];
    $left_arr=array();
    $right_arr=array();
    for($i=1;$i<$n;$i++) {
        if($arr[$i]<=$key)
            $left_arr[]=$arr[$i];
        else
            $right_arr[]=$arr[$i];
    }
    $left_arr=quick_sort($left_arr);
    $right_arr=quick_sort($right_arr);
    return array_merge($left_arr,array($key),$right_arr);
}

6、选择排序

function select_sort($arr) {
    $n=count($arr);
    for($i=0;$i<$n;$i++) {
        $k=$i;
        for($j=$i+1;$j<$n;$j++) {
           if($arr[$j]<$arr[$k])
               $k=$j;
        }
        if($k!=$i) {
            $temp=$arr[$i];
            $arr[$i]=$arr[$k];
            $arr[$k]=$temp;
        }
    }
    return $arr;
}

7、插入排序

function insertSort($arr) {
    $n=count($arr);
    for($i=1;$i<$n;$i++) {
        $tmp=$arr[$i];
        $j=$i-1;
        while($arr[$j]>$tmp) {
            $arr[$j+1]=$arr[$j];
            $arr[$j]=$tmp;
            $j--;
            if($j<0)
                break;
        }
    }
    return $arr;
}

转载自:http://blog.92fenxiang.com/articles/1429003471

phpstom配置远程调试php

需要安装phpdebug的,我用的是xdebug扩展
之前一直是用的sublime的,最近换成了,于是想把之前想装的debug装上去,在公司服务器折腾了几次,都是莫名奇妙的没弄好,今天放假,在自己电脑上安装了xammp,然后就配好了。。。然后就试试在远程服务器上配置(其实就是自己电脑上面的linux虚拟机)
1.确认php安装了php扩展,(如果没有安装,可以百度下怎么安装),安装之后的配置,有很多配置项,我只写几个,能运行起来就行了

vi /etc/php.d/15-xdebug.ini
zend_extension=xdebug.so
xdebug.remote_enable = 1 #默认开启
xdebug.remote_handler = "dbgp" 
xdebug.remote_host = "192.168.152.1" #本地机器的ip
xdebug.remote_mode = "req"
;xdebug.remote_connect_back = 1 #不确定自己ip的话,可以把这项注释去掉
xdebug.remote_port         = 9002 #这个是phpstom设定的监听的端口
xdebug.collect_vars         = On

2.把项目下载到本地,我是直接用的file->settings->Build,Execution,Deployment->Deployment设置的

3.设置ide监听的端口,有两个地方
这里写图片描述
下面的图片里面这样设置,注意的是端口号要和服务器设置的 xdebug.remote_port 一致
这里写图片描述

4.填好服务器名称和下面的服务器和本地文件的映射
这里写图片描述
5.设置debug的配置
这里写图片描述
添加一个 PHP Web Application,选择第四步里面设置好的server
这里写图片描述
5.打开监听这里写图片描述
6.选择刚刚添加的那个debug配置,点击小虫子就可以运行了~~~这里写图片描述
失败的话,失败的话吧服务器的selinux关掉,应该就ok了

抓取百度搜索结果

抓取百度搜索结果,但是用file_get_content会出现false
后来找到一个函数

function curlPost($url, $data=array(), $timeout = 30)

{


    // $interface = "eth0:" . rand(1, 4); //避免GG封IP
    // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    // $cookie_file = dirname(__FILE__) . "/temp/google.txt"; //存储cookie值
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    // curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);//获取浏览器类型
    // curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5");
    // curl_setopt($ch, CURLOPT_INTERFACE, "$interface"); //指定访问IP地址
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    // curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
    $contents = curl_exec($ch);


    curl_close($ch);

    return $contents;
}

用这个函数就可以(没注释),后来想弄明白到底是需要哪一项,于是就注释成了上面的样子,还是ok的,是因为cookie?

php操作局域网内机器的文件

今天有个需求,需要访问局域网内机器的文件,之前没做过,折腾了一天,

$location = "\\\\192.168.1.111\\d$";//184机器上面的d盘
//$location = "\\\\192.168.1.184\\d$\\baidu_syn";//184机器上面的d盘的baidu_syn文件夹
$user = "administrator";//用户名
$pass = "xxxx";//密码
$letter = "z";//把远程机器上的地址映射到本地的盘符
// 下面的意思是把184机器上面的d盘映射到本地的z盘
$cmd="net use ".$letter.": ".$location." \"".$pass."\" /user:\"".$user."\"";
system($cmd);
//下面两个是去除目录下的文件列表,无视就好
$result = my_scandir('Z:');  
var_dump($result);
$result = my_scandir1('Z:');  
var_dump($result);
//映射了不用还得删除吧
$cmd="net use ".$letter.": /delete";
system($cmd);

两台机器都是windows server 2008 r2 enterprise的系统
同事说有个叫ipc\$的东西,可以挂载,搜了下才知道原来是这种方式就是ipc,只不过是用php执行命令行实现的挂载而已,ipc\$详细用法介绍