2020-06-03 11:15:50     分类: Php
摘要: PHP基础

一、请打印出本周的第一天,输出格式为2017-11-20 date('Y-m-d', strtotime('this week'));

这是PHP种日期格式化的问题,在后台分段查询数据的时候都很有用,还有很多: 1.输出上周的周一到周日 date('Y-m-d', strtotime('-1 week Monday'); date('Y-m-d', strtotime('-1 week Tusday'); ...Wednesday Friday Saturday Sunday

2.输出本月第一天,最后一天,上月第一天,最后一天,本年的第一天, 给定日期当月的第一天和最后一天 本月第一天: date('Y-m-01', time()); 本月最后一天: date('Y-m-d', strtotime(date('Y-m-01').' +1 month -1 day')); 上月第一天: date('Y-m-d', strtotime(date('Y-m-01').' -1 month')); 上月最后一天: date('Y-m-d', strtotime(date('Y-m-01').' -1 day')); 本年第一天: date('Y-01-01', time()); 指定日期当月第一天: date('Y-m-01', strtotime('2016-08-02')); 指定日期当月最后一天: date('Y-m-d', strtotime(date('Y-m-01', strtotime('2016-08-02')).' +1 month -1 day'));

3.请计算给定日期当前月有几天 php本身有一个函数cal_days_in_month可以计算指定月有多少天,但是编译PHP未必打开这个选项,所以可以用时间戳之差来计算天数 $dateStr = '2007-12'; $start = strtotime(date('Y-m-01', strtotime($dateStr))); $end = strtotime(date('Y-m-d', strtotime(date('Y-m-01', strtotime($dateStr)).' +1 month -1 day'))); $days =round( ($end-$start)/(606024)); 也可以计算两个时间之间的天数间隔

4.计算今天是星期几,星期中的第几天,月份中的第几天,年中的第几天 $arr = getdate(); //星期几 $arr[''weekday']; //星期中的第几天 $arr['wday']; //月份中的第几天 $arr['mday'] //年中的第几天 $arr['yday']

5.获取本地时间 php.ini中设置 date.timezone="Asia/Shanghai" php中设置 date_default_timezone_set("Asia/Shanghai")

6.如何判断一个字符串是有效的日期格式 if(strtotime('123'))

二、请说明time()与mktime()方法的区别 time()用于返回当前时间的时间戳,mktime()是将一个给定的时间转换为时间戳。 mktime()无参数时mktime()=time() time()返回的是从1970-01-01 00:00:00到当前时间的秒数 mktime()可以接受的有效时间范围为 1901-12-13 - 2038-1-19日,windows系统则是从1970-01-01开始

三、清说明echo(), print(), print_r(), printf(), var_dump()的区别 echo() echo可以一次输出一个或多个值,多个值之间用逗号分隔。echo是语言结构,而不是真正的函数,因此不能作为表达式一部分使用。

print() print输出字符串,print也是以一个语言结构不是真正的字符串,所以不能被函数调用,也因此也不必使用圆括号来扩起它的参数列表

print_r() 可以吧字符串和数字简单的打印出来,而数组以括起来的键值对来标识。但是pint_r输出布尔值和null没有意义,都是"\n",所以用var_dump更合适

printf() printf是格式化输出函数,注意是函数不是语言结构,所以需要用括号括起参数表。相近的函数还有: sprintf : 字符串格式化,可以作为值传递给变量 fprintf : 可以将字符格式化输出到文本文件 $file = fopen('test.txt"); fprintf($file, "Hello %s !","world"); vfprintf: 将文本格式化输出到文本文件,和fprintf的区别是最后参数时数组 $file = fopen('test.txt"); fprintf($file, "%s %s !",["Hello", "world"]); vprintf : 格式化输出字符串,和printf的区别是最后的参数时数组 vsprintf : 和sprintf区别是最后的参数时数组

var_dump() 判断一个变量的类型与长度,并输出变量的数值。如果变量有值就输出变量的值以及数据类型。此函数显示关于一个或多个表达式结构信息,包含表达式的类型和值,数组递归展开值,通过缩进显示结构。

四、is_null, empty, isset, defind的区别 defind() 检测是否测试常量

is_null() 判断变量是否为null, 当变量未定义、未赋值、设置为null时返回为true

isset() 参数已设定,并且不是null。 变过变量未定义、未赋值、设置为null时返回为true

empty() 判断变量是否为空

看示例

$x isset is_null empty if($x) $x未定义 false
true true false $x未设置 false
true true false $x=null false true true false $x="" true false true false $x=true true fase false true $x=false true false true false $x=0 true false true false $x=1 true false false true $x=-1 true flase false true $x=42 true false false true $x="true" true false false true $x="false" true false false true $x="0" true false true true $x="1" true false false true $x="-1" true false false true $x= "42" true false false true $x="php" true false false true

五、请用代码判断是否是正整数 方法1: $n = 10; if(preg_match("/^[1-90-9]*$/", $n){ echo "是正整数"; }else{ echo "不是正整数"; }

方法2: $n = 10; if( (floor($n) -$n) != 0 ){ echo "不是正整数"; }else{ echo "是正整数"; }

方法3: if( !is_numberic($n) || strpos($n, '.’)!==false) { echo "不是正整数"; }else{ echo "是正整数"; }

六、如何在页面之间传递变量(至少两种) GET, SET,COOKIE, HEADER, COOKIE, SESSION,

七、请说明PHP传值和传引用的区别,什么时候用传值,什么时候用传引用 按值传递: 函数范围内对值的任何改变在函数外部都会被忽略; 按引用传递: 函数范围内对值得任何改变在函数外部也能反映出这些修改 按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处

八、include, require, include, include_once的区别 处理方式不同: require require_once失败时会产生一个致命级的错误,程序随之停止。 include include_once失败时产生一个警告级的错误,程序继续运行

require_once include_once在文件已存在时,不再包含

九、请说明如何比较两个浮点数的大小 浮点数比较在于精度问题,可以设定一个小数精度, 然后相减两个浮点数看是否大于这个精度数

十、fun()和@fun()有什么区别 foo() 在执行这个函数时,任何解释错误、语法错误、误执行错误都会显示在页面上 @foo() 执行时隐藏解释错误、语法错误、执行错误信息

十一、PHP中双引号与单引号的区别 1.双引号解释变量单引号不解释变量 2.双引号里插入单引号,单引号里有变量的话,变量解释 3.双引号变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者将变量括起来,否则会将变量后面的部分当做一个整体,引发语法错误。 4.双一号解释转义字符,单引号不解释转义字符 5.能使用单引号尽量使用单引号,单引号的效率要比双引号高,这是因为双引号要先对字符进行遍历以查找变量,而单引号不需要

十二、请列出常用的超全局变量 $_GET - get传输方式 $_POST - post传输方式 $_REQUEST- 可以接收到$_GET和$_REQUEST两种传输方式 $_FILE - 上传文件使用 $_SERVER - 系统环境变量 $_SESSION - 会话控制的时候会使用到 $_COOKIE - 会话控制的时候回使用到

十三、global关键字和global数组有什么区别? $GLBAL['var']是外部全局变量本身,global var 是外部var的同名引用或指针。global $var 等价于 &$GLOBAL['var']

十四、在函数中定义静态变量有什么好处 函数中的静态变量在函数调用时,可以保存上次运行的值,脚本运行完成时,静态变量会销毁。特性与全局、局部变量相同,但作用域更小。

十五、require_once, require, _autoload _autoload>required>require_once

十六、=、==、与===的区别 首先=是赋值符号,==和===是比较运算符 ==只比较值, ===是全等于,还比较变量的类型

十七、请阐述匿名函数及其作用 匿名函数又叫动态函数, 可以将一个函数赋值给变量,也可以将一个函数当做另一个函数的参数。 变量形式的匿名函数可以获得变量作用域,参数形式的匿名函数可以使相关代码、函数定义与隐式调用结合更紧密。

十八、return与exit的区别 return函数专门用在函数体和方法里,在调用函数和方法时,使用return从函数返回调用处 exit语句的功能是在代码逻辑中终端执行

十九、is_callable()和method_exists()的区别 1.method_exists()仅适用于判断类方法,is_callale()可以判断全局函数也可以判断类方法 2.method_exists()上下文无关,is_callable()上下文相关,会判断一个函数在当前环境中可否调用,例如在子类中能否调用父类构造函数 3.method_exists()不判断权限,is_callable()判断权限,例如在类外private和protected会返回false 4.method_exists()不调用__call()方法,is_callable()调用__call方法 5.method_exists()判断速度快, is_callable()速度慢

二十、在php中如何执行linux系统命令 shell_exec('cd /home') 需要打开相关函数,以及给相关的用户权限,但这并不安全,最好的方式是编写sh脚本, 然后将相关操作加入消息队列,然后定时执行

二十一、PHP的安全模式有什么作用,如何打开 在php.ini中开启 safe_mode = on PHP安全模式用于限制用户使用外部命令或执行不安全程序,这种配置多用在保密级别高的服务器,云主机,虚拟主机等多用户环境。

二十二、phar是什么有什么作用 php是从java界jar隐身过来的概念,它允许你打包发布php程序以节省空间,最主要的用途就是PHP程序在线发布,phar并不影响性能,因为它值解开一次。

二十三、什么是金融家算法,在PHP中怎么表示,一般应用在什么场景中 金融家算法是对浮点数的一种舍入算法,又叫四舍六入五成双,也就是小于等于四舍去,大于6则入,5要看操作位是奇数,还是偶数奇数舍,偶数入。 round(1,2345, 2, PHP_ROUND_HALFDOWN) 一般应用在高精度浮点数计算场景,比如财务计算,不过一般金融产品都是黑心的资本家,都是用全入的方式计算利息。

二十四、请指出下面的表达式在性能上有什么欠缺的地方 echo '欢迎'. getUserName(). ' 您上次登录于:' . getUserLastLoginTime(); 语句被执行多次,可以改未 echo '欢迎',getUserName(), ' 您上次登录于:' , getUserLastLoginTime(); 用逗号分隔

二十五、cgi、fast_cgi和php-fpm的区别 A.CGI CGI(Common GateWay Interface),公共网关接口,它是Web服务器与外部应用程序之间传递信息的接口标准。通过CGI接口,WEB服务器就能获得客户端提交的信息。并转交给服务器端的CGI程序处理,最后返回结果给客户端。

CGI的工作就是从环境变量和标准输入中读取数据、处理数据,向标准输出输出数据。

CGI实际上是一个标准接口,CGI程序即实现了CGI接口标准的程序。

CGI程序的的工作方式: WEB服务器一般只处理静态文件请求(如JS、HTML、CSS),如果碰到一个动态脚本请求(如PHP),WEB服务器主进程,就会分出一个新的进程来启动CGI程序,也就是将动态脚本交给CGI程序来处理。启动CGI程序需要需要过程,比如读取文件、加载扩展等。CGI程序启动后,就会解析动态脚本,然后将结果返回给WEB服务器,最后WEB服务器再将结果返回给客户端,刚才分出的进程也会关闭。

这样,每次用户请求动态脚本,WEB服务器都要分出一个新的进程,去启动CGI程序,由CGI程序处理动态脚本,处理完成后进程随之关闭。这是一种息率非常低下的工作方式。

B.WEB服务器内置模块 随着发展,出现了一种更高效的处理方式:WEB服务器内置模块。例如Apache的mod_php模块,将PHP解释器做成模块,然后加载到web服务器中。

这样,apache在启动时,就会同时启动PHP模块。当客户端请求PHP文件时,apache就不会分出一个新的进程来启动php解释器。而是直接将php文件交给运行中的php模块处理。显然,这种方式效率会比较高。

由于apache服务器启动时,才会读取配置文件,加载PHP模块,在apache的运行过程中,不会再重新读取PHP文件,所以每次修改php配置文件后,都必须重启apache,性能的php文件才会生效。

C.Fastcgi Fastcgi就像一个常驻型的CGI程序,可以一直运行。Fastcgi可以和WEB服务分别部署在不同的主机上,它可以接受来自其它WEB服务器的请求。

Fastcgi是语言无关的,其主要行为是将CGI的解释器进程保持在内存中并获得高效的性能。总所周知,CGI解释器的反复加载是CGI性能低下的主要原因。

Fastcgi是一套协议,不再像CGI那样简单的环境变量、标准输入和标准输出来接收和传递数据了,而是用TCP或命名管道来传输数据。

当客户端请求WEB服务器上的动态脚本时,WEB服务器会将动态叫本通过TCP协议或命名管道交给主进程,Fastcgi根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给WEB服务器。WEB服务器再将结果返回给客户端。该客户端请求处理完毕后,Fastcgi子进程并不会完全关闭,而是仅需等待主进程继续安排工作任务。

Fastcgi的效率是很高的。

D.PHP-FPM Fpm是 Fastcgi process manager的缩写,也就是Fastcgi进程管理器的简称。它替换了PHP Fastcgi功能,对于高负载的网站非常有用。

PHP-FPM功能有: a.支持平滑停止/启动的高级进程管理功能。 b.可以工作于不同的gid/uid/chroot环境下,并监听不同的端口和使用不同的phi.ini文件。 c.stdout和stderr日志 d.在发生意外的时候能够重启并缓存被破坏的opcode e.文件上传优化支持 f."慢日志"-记录脚本所导致的异常缓慢。 g.fastcgi_finish_request()-用于请求完成或刷新数据后,继续在后台执行耗时的工作。 h.动态、静态子进程的产生。 i.基本SAPI运行状态信息 j.基于php.ini配置文件

二十六、实现将字符串拆分成每项两个字符串的数组,不足两个的以补足,例如:'abcde’拆分成为['ab', 'cd', 'e'] $str = 'abcde'; $strlength = mbstrlen($str); $str = $strlength>0&&$strlength%2==0?$str:$str.''; $arr = []; for($i=0; $i<$strlength; $i+=2) { $arr[] = mb_substr($str, $i, 2); }

二十七、如何翻转字符串 方法1: strrev($str)

方法2: $len = strlen($str); $new = ''; for($i=$len; $i>=0; $i--) { $new .= $str{$i} }

二十八、使用五种以上的方法获取一个文件的扩展名

function getExt1($path) { return strrchr($path, '.'); }

function getExt2($path) { return substr($path, strrpos($path, '.')); }

function getExt3($path){ return array_pop(explode('.', $path)); }

function getExt4($path){ $p = pathinfo($path); return $p['extension']; }

function getExt5($path){ return strrev(substr(strrev($path), 0, strpos(strrev($path), '.'))); }

二十九、mysql_fetch_raw() 和 mysql_fetch_array()有什么区别 mysql_fetch_row() 把数据库的一列储存在一个以零为基数的阵列中,第一栏在阵列的索引 0,第二栏在索引 1,如此类推。 mysql_fetch_assoc() 把数据库的一列储存在一个关联阵列中,阵列的索引就是栏位名称,例如我的数据库查询送回“first_name”、“last_name”、 “email”三个栏位,阵列的索引便是“first_name”、“last_name”和“email”。 mysql_fetch_array() 可以同时送回 mysql_fetch_row() 和 mysql_fetch_assoc() 的值。

三十、如何获取当前页面的URL $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];

三十一、试阐述可变函数参数 可变函数参数时php5.6后添加的,应该是EMScript7获取的灵感,用...三个点号表示,有两种放肆 1.作为函数的参数表 function some(...argv) some(1,2,3) 可无限添加,可遍历 2.作为函数调用使用 function some(a,b,c) some(...[1,2,3]) 按顺序一一对应

三十二、如何判断两个日期是否在同一周 只表述,获取日期A所在周的周一和和下周一的时间戳,判断日期B的时间戳是否在这个范围内

三十三、计算数组中最大值与最小值的差值 $arr = [1,2,3]; $maxVal = max($arr); $minVal = min($arr); $sub = $maxVal - $minVal;

三十四、以下代码输出什么 <?php echo -10%3; ?> 答案为-1 这道题考察的是运算符的优先级,%优先级高于-号

三十五、以下代码输出什么 //file1.php <?php $a = '123'; ?> <?php echo include('file1.php'); ?> include也是函数,也有返回

三十四、以下代码输出什么 <?php $count = 5; function get_count() { static $count = 0; return $count++; } ++$count; get_count(); echo get_count(); ?> 输出1 因static $count,所以只在第一次调用get_count的时候对$count赋值为0,第二次再进来这个函数,则不会第二次赋值。其次就是return $count++和return ++$count了,前者先返回,后者先++再返回。

三十五、以下代码输出什么 <?php $arr= array(0 =>1,'aa' =>2,3,4); foreach($arr as $key => $val){ print($key == 'aa' ? 5 : $val); } ?> 答案:5534. 考查:类型转换。 因遍历数组第一次的时候,$key和aa的比较实际就是0和aa的比较,一个是int一个是string,这个时候会转换类型,将字符串转换为数字再与数字比较。所以0=='aa'就是0==0,所以为true,也就是输出5。虽然PHP是若类型语言,但是人家也有类型的好吗。

三十六、以下代码输出什么 <?php echo count (false); $a = count ("567") + count(null)

  • count(false); echo $a; ?> 答案:2. 考查:count的用法。 因count()的官方解释“If the parameter is not an array or not an object with implemented Countable interface, 1 will be returned.”. 意思是说,如果不是数组或者对象的其他类型,返回1.那么这个值应该就是1+0+1了(boolen人家也是一个类型,虽然是讨厌的false)。NULL的意思是没有值,难道在计数函数中还能有1?

三十七、以下代码输出什么 <?php $arr = array(1,2,3); foreach($arr as &$val) { $val += $val % 2 ? $val++ : $val--; } $val = 0; print(join('',$arr)); ?> 答案:330。 考查:++和&。 因foreach结束后的数组应该是array(3,3,7);最后给第三个元素赋值为0,所以就是330了。其中注意的是&,如果有&则是对原变量操作,如果没有,则是先生成一个新变量,然后给这个变量复制,最后操作的是这个新变量。

三十八、以下代码输出什么 <?php echo intval((0.1+0.7)10); ?> 答案:7。 考查:浮点数的概念。 因0.1+0.7=0.8 0.810=8 所以转换成整数后还是8?错!因为0.1+0.7=0.8是浮点数,0.8*10在数学计算中是正整数8, 可是在计算机中它仍然是浮点数8,什么叫浮点数8?每一个看起来像整数的浮点数,其实都不是整数,比如这个8,它其实只是7.9999循环,无限接近于8,转换成整数会舍弃小数部分,就是7喽。

三十九、以下代码输出什么 <?php ini_set('display_errors',0); $arr = array(1=>1,3=>3); $i = 2; $a = 'test' . isset($arr[$i]) ? $arr[$i] : $i; 请问$a的值是什么? A、test B、NULL C、2 D、test2 ?> 答案:B。 考查:优先级。 因“."的优先级高于三元运算符"?:"。所以程序其实报错了。会说$arr的索引2不存在。

四十、以下代码输出什么 <?php $a = 3; $b = 5; if($a = 5 || $b = 7) { $a++; $b++; } echo $a . " " . $b; ?> A、6 8 B、6 6 C、2 6 D、1 6 E、4 6 答案:D。 考查:优先级,基础概念,++。 因“="的优先级低于“||”,所以先逻辑判断再赋值。 也就是($a = (5 || $b = 7))。所以,最后其实给a赋值了,$a等于1.

四十一、以下代码输出什么 <?php $x = 2; echo $x == 2 ? '我' : $x == 1 ? '你' : '它'; ?> 输出的结果是() A、我 B、你 C、它 D、syntax error 答案:B。 考查:优先级。 因“=="的优先级高于“?:”

四十二、如何获取客户端IP地址 if(!empty($_SERVER['HTTP_CLIENT_IP'])){ $ip = $_SERVER['HTTP_CLIENT_IP']; }else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }else{ $ip = $_SERVER['REMOTE_ADDR']; }

四十四、以下代码输出什么 $a = '1'; $b = &$a; $b = "2$b"; echo $a.",".$b; 输出: 21,21 考察的是参数的传引用

四十五、PHP中有哪些错误类型以及他们的区别 1.注意 Notices 这些都是比较小而且不严重的错误,比如去访问一个未定义的变量,通常这类错误提示是不提示给用户的,单有时这些错误会影响到运行结果。 2.警告 Warnnings 这些就是稍微严重一些的错误了,比如想要include一些本不存在的文件。这样的程序会提示给用户,但是不会终止程序运行。 3.致命错误Fatals 这就是比较严重的错误了,比如你想初始化一个根本不存在的类的对象,或者调用一个不存在的函数,这些错误会导致程序结束运行,PHP也会将这些错误

四十六、以下代码输出什么 $a = [ 'a'=>1, 'b'=>2]; $b = [ 'a'=>3, 'b'=>4]; var_dump(array_merge($a, $b)); 输出的是: array(2) { ["a"]=> int(3) ["b"]=> int(4) } 因为array_merge是覆盖的, +就是1,2舍弃后面的

四十七、如何开启PHP错误报告 在php.ini中设置display_errors = on 代码中插入error_reporting(E_ALL)

四十八、什么是Traits Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。 Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。

四十九、可以继承一个final定义的类吗 不可以,final限定了类不可以继承,也可以限定类不可以重写.

五十 、以下代码输出什么 <?php $i = 016; echo $i / 2; ?> 输出7 016是二进制的14

五十一、以下代码输出什么 <?php $x = 5; echo $x+++$x++ ?> 输出11 等于$x+((++$x)++)

五十二、判断下面三个不等式 var_dump(0123 == 123); var_dump('0123' == 123); var_dump('0123' === 123); 1.false 因为前面是二进制 2.true 字符串自动转换为数值 3.false 两个类型不同

五十三、下面代码输出什么 <?php $text = 'John'; $text[10] = 'Doe'; echo strlen($text); ?> 输出11

五十四、清写出一个匹配手机号的正则表达式 /^1[3|4|5|7|8]\d{9}$/

正则表达式的知识点:

1.匹配字母和数字组成的6-32密码: /^[a-zA-z0-9]{6,32}$/ 2.密码由大写字母,小写字母、数字组成6-32位,这三种必须全部包含 现在爆库太多了,所以密码强度验证就代替早期简单的验证规则了 /^(?=.[a-z])(?=.[A-Z])(?=.\d)[^]{6,32}$/ 用到贪婪模式 3.匹配email : /^[a-z]([a-z0-9][-]?[a-z0-9]+)@([a-z0-9][-]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?$/i; 4.匹配url (https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~|!:,.;]+[-A-Za-z0-9+&@#/%=~|]

五十五、回文字符串是从头到尾和从尾到头读都是一样,ABCDCBA,写个函数isHuiwen判断一个字符串是回文字符串 <?php funcrion isHuiwen($text) { $temp = strrev($text); return $text == $temp; }

五十六、不适用strlen函数,你会如何实现字符串长度计算 function strlen($str) { if($str=='') return 0; $count = 0; while(1){ if($str[$count]!=null){ $count++; continue; }else{ break; } } return $count; }

五十七、请你自己实现一个字符串截取函数 function substr($str, $start, $length=NULL)
{
if ($str== '' || $start>strlen($str )) return;
if (($length!=NULL) && ( $start>0) && ($length> strlen($str)-$start)) return;
if (( $length!=NULL) && ($start< 0) && ($length>strlen($str )+$start)) return;
if ($length == NULL) $length = (strlen($str ) - $start);

    if ($start <  0){  
            for ($i=(strlen( $str)+$start); $i<(strlen ($str)+$start+$length ); $i++) {  
                    $substr .=  $str[$i];  
            }  
    }  
    if ($length  > 0){  
            for ($i= $start; $i<($start+$length ); $i++) {  
                    $substr  .= $str[$i];  
            }  
    }  
    if ( $length < 0){  
            for ($i =$start; $i<(strlen( $str)+$length); $i++) {  
                    $substr .= $str[$i ];  
            }  
    }  
    return $substr;  

}

五十八、请你自己实现一个字符串翻转函数 function strrev($str)
{
if ($str == '') return 0 ;
for ($i=(strlen($str)- 1); $i>=0; $i --){
$rev_str .= $str[$i ];
}
return $rev_str;
}

五十九、请自实现一个简单加解密的函数 //加密 function php_encrypt($str)
{
$encrypt_key = 'abcdefghijklmnopqrstuvwxyz1234567890';
$decrypt_key = 'ngzqtcobmuhelkpdawxfyivrsj2468021359';
if ( strlen($str) == 0) return false;
for ($i=0; $i<strlen($str); $i ++){
for ($j=0; $j <strlen($encrypt_key); $j ++){
if ($str[$i] == $encrypt_key [$j]){
$enstr .= $decrypt_key[$j];
break;
}
}
}
return $enstr;
}

//解密 function php_decrypt($str)
{
$encrypt_key = 'abcdefghijklmnopqrstuvwxyz1234567890';
$decrypt_key = 'ngzqtcobmuhelkpdawxfyivrsj2468021359';
if ( strlen($str) == 0) return false;
for ($i=0; $i<strlen($str); $i ++){
for ($j=0; $j <strlen($decrypt_key); $j ++){
if ($str[$i] == $decrypt_key [$j]){
$enstr .= $encrypt_key[$j];
break;
}
}
}
return $enstr;
}

五十八、addslashes()和htmlspecialchars()的区别 addslashes()函数主要在指定的预定义字符前添加反斜杠,这些预定义字符包括: 单引号 ' 双引号 " 反斜杠
NULL addslashes()函数主要作用是保证这些预定义字符能够正确入库,仅此而已。

htmlspecialchars()函数把一些预定义字符转换为html实体,这些预定义字符包括 & & " " ' ' < <

$gt;

五十九、如何去除数组中重复元素 array_unique();

六十、如何使用array_multisort函数实现对多为数组进行排序? //模拟从数据库中查询出来的记录(提示:二维数组)
$arr[] = array("age"=>20,"name"=>"小强");
$arr[] = array("age"=>21,"name"=>"李伟");
$arr[] = array("age"=>20,"name"=>"小亮");
$arr[] = array("age"=>22,"name"=>"黎明");

foreach ($arr as $key=>$value){
$age[$key] = $value['age']; //排序字段 "age"
$name[$key] = $value['name'];//排序字段 "name"
}

/**

  • 1、对 $arr 数组进行排序
  • 首先按照年龄从大到小的顺序排列,如果年龄相同再按照名字的顺序排序,类似于sql中的order by
  • 2、注意事项:
  • (1)$age和$name 等价于 数据表的"age"和"name"列字段,类似于 "order by age desc,name asc"
  • (2)排序顺序标志:
  • SORT_ASC - 按照上升顺序排序
  • SORT_DESC - 按照下降顺序排序
  • (3)排序类型标志:
  • SORT_REGULAR - 将项目按照通常方法比较
  • SORT_NUMERIC - 将项目按照数值比较
  • SORT_STRING - 将项目按照字符串比较
  • (4)排序标志的默认值为: SORT_ASC 和 SORT_REGULAR
  • (5)每个一维数组后指定的排序标志仅仅对该一维数组有效,一个一维数组不能指定两个同类的排序标志
  • (6)该函数会改变数字索引,其它索引不改变
  • */
    array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$arr);
    echo "

    ";print_r($arr);exit;
    /**

  • 结果: 等价于 "select * from user order by age desc,name asc";
  • Array(
  • [0] => Array
  • (
  • [age] => 22
  • [name] => 黎明
  • )
  • [1] => Array
  • (
  • [age] => 21
  • [name] => 李伟
  • )
  • [2] => Array
  • (
  • [age] => 20
  • [name] => 小亮
  • )
  • [3] => Array
  • (
  • [age] => 20
  • [name] => 小强
  • )
  • ) */

六十一、unset()和array_splice()删除数组元素有什么区别 unset()方法单一,删除后索引不会重排 array_splice()用法很多,删除后索会重排

六十二、移除数组中元素有几种方式 //案例一:
$arr1 = array('1','2','3','4');
//提示:虽然删除了元素,但是没有重建数组索引
unset($arr1[2]);
echo "

";print_r($arr1);
/**

  • 使用unset()函数处理后的结果:
  • Array(
  • [0] => 1
  • [1] => 2
  • [3] => 4
  • ) */

//案例二:
$arr2 = array('1','2','3','4');
//提示:删除了元素,并且重建了数组索引
array_splice($arr2, 2, 1);//参数2-开始位置 参数3-删除元素数量
echo "

";print_r($arr2);
/**

  • 使用array_splice()函数处理后的结果:
  • Array(
  • [0] => 1
  • [1] => 2
  • [2] => 4
  • ) */

//案例三:
$arr3 = array('1','2','3','4');
//提示:删除了元素,被移除的元素由参数4来替代
array_splice($arr3, 2, 1,array("5"));//参数1-原数组 参数2-开始位置 参数3-删除元素数量 参数4-替换被移除元素的数组
echo "

";print_r($arr3);
/**

  • 使用array_splice()函数处理后的结果:
  • Array(
  • [0] => 1
  • [1] => 2
  • [2] => 5
  • [3] => 4
  • ) */

//案例四:
$arr4 = array('1','2','3','4');
//提示:从数组中截取一段元素并返回(返回的数组索引被重建)
$arr5 = array_slice($arr4, 2, 1);//参数2-开始位置 参数3-删除元素数量
echo "

";print_r($arr5);
/**

  • 使用array_slice()函数处理后的结果:
  • Array(
  • [0] => 3
  • ) */

六十三、如何对数组元素进行递归转义 function daddslashes($string, $force = 1) {
if(is_array($string)) {//是否对数组中各元素进行转义操作
$keys = array_keys($string);//数组中的键
foreach($keys as $key) {//循环数组中的键
$val = $string[$key];//获取数组中键所对应的元素值
unset($string[$key]);//删除元素
//给元素重新赋值(键名和键值都进行了转义:主要用于入库操作)
$string[addslashes($key)] = daddslashes($val, $force);//递归调用
}
} else {
$string = addslashes($string);//对字符串进行转义
}
return $string;//返回转义好的数组或字符串
}

六十四、如何将查询字符串解析到变量中 parse_str()函数

六十五、如何将 1234567890 转换成 1,234,567,890 每三位用逗号隔开的形式 number_format(1234567890);

六十六、stripos(), strpos(), strripos(), strrpos()的区别 1.stripos() 返回字符串在另一字符串中第一次出现的位置 大小写不敏感 2.strpos() 返回字符串在另一字符串中第一次出现的位置 大小写敏感 3.strripos() 返回字符串在另一字符串中最后一次出现的位置 大小写不敏感 4.strrpos() 返回字符串在另一字符串中最后一次出现的位置 大小写敏感

六十七、如何用PHP环境变量得到一个网页地址的内容 $_SERVER['REQUEST_URI']

六十八、array_map()和array_work()函数的区别 array_map() 返回用户自定义函数作用后的数组 array_walk() 对数组中每个函数使用回调函数,返回bool值 ? $array = array('AAA', 'bbb');
$map_array = array_map('strtolower', $array);
/**

  • 输出结果:
  • Array(
  • [0] => aaa
  • [1] => bbb
  • ) */
    print_r($map_array);
    /**
  • 输出结果:
  • Array(
  • [0] => AAA
  • [1] => BBB
  • ) */
    print_r($array);

//如果回调函数需要直接作用于数组中的值,可以将回调函数的第一个参数指定为引用:&$value
function array_walk_func(&$v, $k){
$v = strtolower($v);
}
$walk_array = array_walk($array, 'array_walk_func');
/**

  • 输出结果:1 */
    print_r($walk_array);
    /**
  • 输出结果:
  • Array(
  • [0] => aaa
  • [1] => bbb
  • ) */
    print_r($array);

六十九、统计一维数组中所有值出现的次数 array_count_values($arr);

七十、如何读取php.ini配置文件中的配置选项的值 echo ini_get('post_max_size');//获取上传文件的最大尺寸
echo get_cfg_var('post_max_size');//获取上传文件的最大尺寸

七十一、static静态变量在函数中有哪些特点 1.静态局部变量不会随着函数的调用和退出而发生变化; 不过,尽管该变量还继续存在,但确不能在函数外部直接使用它(获取不到值). 倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值. 2.静态局部变量只会初始化一次. 3.静态局部变量只能被初始化为一个字符值或一个常量,不能使用表达式. 即使静态局部变量定义时没有赋初值,系统会自动赋初值0. 4.当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量. 5.static $var=5;//【变量的赋值操作只会在变量第一次初始化时会被调用,在之后函数的执行过程中该操作不会被调用】 6.静态变量是只存在于函数作用域的变量,不过,在函数执行完成后,这种变量的值不会丢失, 也就是说,在下一次调用这个函数时,变量仍然会记得原来的值. 要将某个变量定义为静态的,只需要在变量前加上static关键字即可

七十三、类中的static静态属性和方法有什么作用 1.无论你实例化了多少个对象,static定义的属性和方法,都只有一个,只占有一次内存,节省了系统的内存开销

2.访问static属性和方法时,只能用::访问 3.静态成员是一种类变量,可以把它看成时属于整个类而不是属于类的某个实例。 与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的 也就是说,所有的实例共享这个成员

4.$this只表示类的当前实例, self::表示的是类本身,在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置。 也就是说,在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。 与$this不同的是,在使用静态变量时,必须在作用域限定符后面加上$符号 如: $this->name;//调用非静态属性 self::$name;//调用静态属性

5.扩展类中,在基类的方法被重写的情况下,使用 parent 作用域调用定义在基类中的方法。 静态成员也可以只属于父类。如果在子类和父类中同时声明了某个成员,也可以使用parant::在子类中访问父类中的变量。 在这种情况下,父类的静态成员和子类的静态成员保存的是不同的值

6.可以在::操作符的左边写上类的名称来静态地访问某个成员,这样避免创建类的实例. 不仅可以省略掉实例化类的代码,而且还会更高效,因为类的每个实例都会占用一小部分的系统资源

七十四、如何将外网图片本地化 copy("http://image.v1.cn/vodone/20150723/303862_0x0.jpg",'e:/wamp/www/303862_0x0.jpg';);

七十五、如何在数组任意位置插入元素 array_splice


文章标签: