1、PHP翻转中文字符串,我用下面的代码进行测试

$high = count($arr),我用下面的代码进行测试,以后写博客一定要非常谨慎,1、PHP翻转中文字符串,2、PHP计算URL的文件后缀名,$str6 = ‘0’,echo $str1==$str2

function demo(&$a, &$b) { $a =& $b; }
$a = 1;
$b = 2;
demo($a, $b);
$b = 3;
print $a;
?>

PHP 内部据守多少个copy on write 的尺度。实际上这些引用是剩下的。

 代码如下

一、基础题 1. 写出如下程序的出口结果 复制代码 代码如下: $str1 = null; $str2 = false;
echo $str1==$str2 ? ‘相等’ : ‘不相等’; $str3 = ”; $str4 = 0; echo
$str3==$str4 ? ‘相等’ : ‘不相等’; $str5 = 0; $str6 = ‘0’; echo
$str5===$str6 ? ‘相等’ : ‘不相等’; ?> 2. 写出如下程序的出口结果
复制代码 代码如下: $a1 = null; $a2 =
false; $a3 = 0; $a4 = ”; $a5 = ‘0’; $a6 = ‘null’; $a7 = array(卡塔尔; $a8 =
array; echo empty ? ‘true’ : ‘false’; echo empty ? ‘true’ : ‘false’;
echo empty ? ‘true’ : ‘false’; echo empty ? ‘true’ : ‘false’; echo empty
? ‘true’ : ‘false’; echo empty ? ‘true’ : ‘false’; echo empty ? ‘true’ :
‘false’; echo empty ? ‘true’ : ‘false’; ?> 3.
写出如下程序的输出结果
复制代码
代码如下: $test = ‘aaaaaa’; $abc = & $test; unset; echo $abc; ?> 4.
写出如下程序的输出结果
复制代码
代码如下: $count = 5; function get_count(){ static $count = 0; return
$count++; } echo $count; ++$count; echo get_count; ?> 5.
写出如下程序的出口结果
复制代码
代码如下: $GLOBALS[‘var1’] = 5; $var2 = 1; function get_value(){
global $var2; $var1 = 0; return $var2++; } get_value(); echo $var1;
echo $var2; ?> 6. 写出如下程序的出口结果 复制代码 代码如下: function get_arr; } $arr1 =
array; $arr2 = array; get_arr; get_arr; echo count; echo count; ?>
7. 应用八种以上办法获得三个文件的扩张名
要求:dir/upload.image.jpg,寻觅 .jpg 可能 jpg ,
必得接受PHP自带的管理函数实行管理,方法不能够分明重复,能够封装成函数,例如get_ext1, get_ext2 二、算法题 1.
行使PHP描述冒泡排序和高速排序算法,对象能够是多个数组 2.
使用PHP描述顺序查找和二分查找算法,顺序查找必得思考功能,对象可以是一个一成不改变数组

$a 输出是有些吗?不错,是2. 然则,笔者一发轫感到是3。
那么怎么解释上边这么些主题素材吗?
实则,函数的参数引用是如此进行的。
复制代码 代码如下:
$tmp = $a;
$a1 = &$tmp;
$a = $tmp;
unset($a1, $tmp);

那篇文章,写的可比早,有一点荒诞的传教,作者代表特别歉意。一些代码,未有通过严俊的测量检验,以往写博客必要求特别小心。因为或者会对生机勃勃部分人发出错误的指导。

 代码如下

  1. 写贰个二维数组排序算法函数,可以具有通用性,能够调用php内置函数
    (以下答案不分明是最棒的,只是三个简练的参阅) 一、基础题 1. 等于
    相等 不相等 2. true true true true true false true false 3. aaaaaa 4. 5
    0 1 5. 5 2 6. 1 2 7. 采纳三种以上办法拿到二个文书的恢弘名 复制代码 代码如下: function get_ext1{ return
    strrchr; } function get_ext2{ return substr($file_name, strrpos; }
    function get_ext3{ return array_pop(explode; } function get_ext4{ $p
    = pathinfo; return $p[‘extension’]; } function get_ext5{ return
    strrev(substr, 0, strpos, ‘.’))); } 二、算法题 1.
    用到PHP描述冒泡排序和便捷排序算法,对象能够是三个数组 复制代码 代码如下: //冒泡排序 function
    bubble_sort { $count = count; if return false; for($i=0; $i$i; $j–){
    if ($array[$j] < $array[$j-1]){ $tmp = $array[$j]; $array[$j]
    = $array[$j-1]; $array[$j-1] = $tmp; } } } return $array; }
    //急忙排序 function quick_sort { if return $array; $key = $array[0];
    $left_arr = array(); $right_arr = array(卡塔尔国; for ($i=1; $i三个有序数组
    复制代码 代码如下: //二分查找 function
    bin_sch($array, $low, $high, $k){ if { $mid = intval; if { return $mid;
    }elseif { return bin_sch($array, $low, $mid-1, $k); }else{ return
    bin_sch($array, $mid+1, $high, $k卡塔尔国; } } return -1; } //顺序查找
    function seq_sch{ $array[$n] = $k; for{ if{ break; } } if { return
    $i; }else{ return -1; } } 3.
    写三个二维数组排序算法函数,可以享有通用性,能够调用php内置函数
    复制代码 代码如下: //二维数组排序,
    $arr是数码,$keys是排序的健值,$order是排序法则,1是升序,0是降序
    function array_sort($arr, $keys, $order=0) { if { return false; }
    $keysvalue = array(); foreach { $keysvalue[$key] = $val[$keys]; }
    if{ asort; }else { arsort; } reset; foreach($keysvalue as $key =>
    $vals) { $keysort[$key] = $key; } $new_array = array();
    foreach($keysort as $key => $val) { $new_array[$key] =
    $arr[$val]; } return $new_array; }

果真,多了60K 的内部存款和储蓄器。估量和PHP的内部存款和储蓄器管理机制有关系。
到现在全体都明白了呢!今日,想了一点个小时,才把这几个难点想通,不敢独享。
函数中的引用不是给你传参数方便的,而是让您兑现,三个函数,能够有四个再次来到值的,所以,最佳不要画蛇著足。
其实,用引用它会下落质量。

 

2、归拢列排在一条线序

在这里地,$mid
接纳了先减后加的主意计算,目标是为了防御整数的溢出。不是故意写复杂了。
小编用上边包车型地铁代码进行测量检验:
复制代码 代码如下:
$data = array();
for ($i = 0; $i < 1000000; $i++)
{
$data[] = array(“sq” => $i * 2);
}
var_dump(binsearch($data, “sq”, 10000));

 这一个标题,实际上涉及了zend 引擎怎么样保管PHP变量。

 代码如下

复制代码 代码如下:
function binsearch(&$arr, $key, $value)
{
$low = 0;
$high = count($arr);
while ($low <= $high) {
$mid = floor($low + ($high – $low) / 2);
$item = $arr[$mid][$key];
if ($item == $value) {
return $mid;
} else if ($value > $item) {
$low = $mid + 1;
} else {
$high = $mid – 1;
}
}
return false;
}

新生督察了大器晚成晃内部存款和储蓄器,data 数组 占用了 230M 的内部存款和储蓄器。而 binsearch
的时候,占用了60K 的内部存储器。不过,理论上的话,binsearch

 代码如下

此处,引用的实际是二个不经常变量。这时,$tmp 是带引用属性的,而$a
变量不是带援引属性的。
基于zend引擎管理内部存款和储蓄器的点子,在当中,不能够用贰个zval
来代表,必需压迫分离那些zval。
用如此的接头方法,上边的主题素材就一蹴即至了。函数内部,不会变动函数外部的引用特性。那也是PHP
不赞同用 calltime_by_ref 的缘由,而筛选方面如此低效的正片方法。
上边包车型客车深入分析,也能评释,在传递参数时,的确爆发了拷贝。
在 binsearch 函数里面。
$data[0] = 1;
如此,就可以时有发生二回$data 所在zval 的正片。内部存款和储蓄器使用量 便是60K。和函数调用加引用大同小异。
恐怕过四个人会疑窦,为啥不是多了230M呢,那实际正是PHP的英明之处,数组Key
对应的是二个zval的指针。(内部是三个哈希表)
之所以,只要把这个指针复制叁回就就好了,数据并非复制。然则,100万的PHP
哈希表实际上要占用 50M 内部存款和储蓄器。为何唯有60K啊。
在 binsearch 函数的外部,运维
复制代码 代码如下:
$t = $data;
$t[0] = 1;
unset($t);

 

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;
}

意识,binsearch 的时候,总是要花个
0.2s左右。理论上来说,100万的数量,最多也正是循环二十三次。怎会如此慢呢。
新生监控了风流倜傥晃内部存款和储蓄器,data 数组 占用了 230M 的内部存款和储蓄器。而 binsearch
的时候,占用了60K 的内部存款和储蓄器。不过,理论上的话,binsearch
不应当吞没如此多的内部存储器。因为,作者感觉,作者早已用引用了,根本就不曾对data
的结构进行纠正。
本身也是高深莫测,后来,作者把引用参数去掉,居然 binsearch 只要 0.0002s
,看来是援用费用了汪洋的cpu 财富。
PHP 内部据守一个copy on write 的尺度。实际上这一个援引是剩下的。
只是怎么,加了引用速度会变慢呢?明天主要就谈谈那么些主题材料。领会道理后,大家确定精晓怎么用引用了。
比方在binsearch 调用前,直接 $a =
&$data,这几个引用的快慢会极度的快。看来分明不是援用小编发生的主题素材。
以此难点,实际上涉及了zend 引擎如哪个地方理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
        )
 
)

$data = array();
for ($i = 0; $i < 1000000; $i++)
{
    $data[] = array(“sq” => $i * 2);
}
var_dump(binsearch($data, “sq”, 10000));

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’

自个儿也是疑惑不解,后来,我把引用参数去掉,居然 binsearch  只要 0.0002s
,看来是引用花费了大气的cpu 财富。

function getext($url){
    $data = parse_url($url);
    $path = $data[‘path’];
    $info = pathinfo($path);
    return $info[‘extension’];
}
echo getext(‘ ‘);
//结果:’html’