基础函数

一、数组操作的基本函数
    array_values($arr);    //获得数组的值
    array_keys($arr);       //获得数组的键名
    array_flip($arr);         //数组中的值与键名互换(如果有重复前面的会被后面的覆盖)
    array_search('PHP',$arr);   //检索给定的值,加true则是严格类型检查
    array_reverse($arr);            //将数组中的元素翻转
    in_array("apple", $arr);      //在数组中检索apple
    array_key_exists("apple", $arr);    // 检索给定的键名是否存在数组中
    array_count_values($arr);             // 统计数组中所有值出现的次数
 
二、数组的分段和填充
    array_slice($arr, 0, 3);    //可以将数组中的一段取出,此函数忽略键名(数组的分段)
    array_splice($arr, 0, 3,array("black","maroon"));    //可以将数组中的一段取出,与上个函数不同在于返回的序列从原数组中删除
    array_chunk($arr, 3, TRUE);   //可以将一个数组分割成多个,TRUE为保留原数组的键名(分割多个数组)
 
四、数组与栈,列队
    array_push($arr, "apple", "pear");    //将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数
    array_pop($arr);    // 将数组栈的最后一个元素弹出(出栈)
    array_shift($arr);   //数组中第一个元素移出并返回(数组长度减1,其他元素向前移动一位,数字键名改为从零计数,文字键名不变)
    array_unshift($arr,"a",array(1,2));  //在数组的开头插入一个或多个元素


六、数组的排序

    sort($arr);       //由小到大,忽略键名       rsort($arr);      //由大到小,忽略键名
    asort($arr);     //由小到大,保留键名       arsort($arr);    // 由大到小,保留键名
    ksort($arr);     //按照键名正序排序           krsort($arr);   // 按照键名逆序排序
 

七、数组的计算

    array_sum($arr);   //对数组内部的所有元素做求和运算(数组元素的求和)
    array_merge( arr2);      //合并两个或多个(相同字符串键名,后面覆盖前面,相同的数字键名,后面的附加到后面)
 
    array_diff( arr2);           //返回差集结果数组   array_diff_assoc( arr2, $arr3);  //返回差集结果数组,键名也做比较
    array_intersect( arr2);  //返回交集结果数组    array_intersect_assoc( arr2);   //返回交集结果数组,键名也做比较 


八、其他的数组函数

    array_unique($arr);   //移除数组中重复的值,新的数组中会保留原始的键名
    shuffle($arr);             // 将数组的顺序打乱
 
php魔术方法与魔术常量
方法:__construct(),__destruct(),    方法重载:__call(),__callStatic()。
属性重载:__get(),__set(),__isset(),__unset(),这四个只对类中,私有,受保护的成员属性有效
__toString(),__autoload();
_set_state(); //自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组。
 
__clone();       //通常用于对副本进行重新初始化,
说 明:this指副本对象引用,that指原对象引用 等方法在 PHP 中被称为”魔术方法”。PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
 
常量:__LINK__     //文件中的当前行号。
        __FILE__       //文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
        __DIR__       //文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录,它等价于 dirname(__FILE__)。
 
        __FUNCTION__      //函数名称。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
        __CLASS__             //类的名称。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
        __METHOD__        //类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
        __NAMESPACE__   //当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)
 

PHP 如何获取客户端的IP地址,

用$_SERVER获取的IP地址有什么问题?

$_SERVER['REMOTE_ADDR'] ;   通过全局数组来获得 

getenv('REMOTE_ADDR') ; 通过环境变量来获得

当客户机使用代理的时候获取不到真实的IP地址

写一个函数,可以遍历文件夹下的所有文件和文件夹。

 1 function get_dir_info($path){
 2           $handle = opendir($path);//打开目录返回句柄
 3           while(($content = readdir($handle))!== false){
 4                 $new_dir = $path . DIRECTORY_SEPARATOR . $content;
 5                 if($content == '..' || $content == '.'){
 6                        continue;
 7                 }
 8                 if(is_dir($new_dir)){
 9                       echo "<br>目录:".$new_dir . '<br>';
10                       get_dir_info($new_dir);
11                 }else{
12                       echo "文件:".$path.':'.$content .'<br>';
13                 }
14           }
15       }
16       get_dir_info($dir);

PHP缓存技术有哪些? tp是局部还是完全缓存?

1. 全页面静态化缓存,也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程
2. 页面部分缓存,将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示
3. 数据缓存,通过一个id进行请求的数据,将数据缓存到一个php文件中,id和文件是对应的,下次通过这个id进行请求时 直接读php文件
4. 查询缓存,和数据缓存差不多,根据查询语句进行缓存;
5. 常用的缓存技术有:redis和memcache
个人认为tp应该是全局缓存 因为:tp缓存实在本地生成一个php文件来存储数据库中读取出来的数据

strlen()与mb_strlen的作用与区别

在PHP中,strlen与mb_strlen是求字符串长度的函数
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍(在 UTF-8编码下,一个汉字占3个字节)。
 
采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串str的长度,可以用mb_strlen(str,'utf-8').如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。

需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。
一 群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
 1 <?php
 2  function fuhuan($allnum, $ti){
 3   $arr = array();
 4   for($i = 0; $i < $allnum; $i++){
 5    $arr[$i] = $i;
 6   }
 7  
 8   $nums = 1;
 9   while(count($arr) > 1){
10    foreach ($arr as $key => $value) {
11     if($nums == $ti){
12      unset($arr[$key]);
13      $nums = 1;
14     }else{
15      $nums++;
16     }
17    }
18   }
19   $new_arr = array_values($arr);
20   var_dump($new_arr[0] + 1);
21  }
22  fuhuan(10,10);

isset() 、empty()与is_null的区别

1、当变量未定义时,is_null()和“参数本身”是不允许作为参数判断的,会报Notice警告错误;

2、empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!

3、isset():仅当null和未定义,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定义,均返回false;

5、is_null():仅判断是否为null,未定义 报警告;

6、变量本身作为参数,与empty()一致,但接受未定义变量时,报警告;

 

MVC的优缺点

1、 MVC的优点 
        (1) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 
        (2) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 
        (3) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。 
        (4) 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。 
2、 MVC的不足之处 
        (1) 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 
        (2) 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 
        (3) 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 
        (4) 目前,一般高级的界面工具或构造器不支持MVC模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。

 

session与cookie的联系和区别(运行机制),session共享问题解决方案:

 

区别与联系:

 

    使用session_start()调用session,服务器端在生成session文件的同时生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为PHPSESSID(session name)(默认)值为一个128位的哈希值。服务器端将通过该cookie与客户端进行交互,session变量的值经php内部系列化后保存在服务器 机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互,即服务器自动发送了http 头:header(‘Set-Cookie: session_name()=session_id(); path=/’);即setcookie(session_name(),session_id());当从该页跳转到的新页面并调用 session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到则新建一个数据集。

 

共享方案:

 

1:使用数据库保存session, 使用数据库来保存session,就算服务器宕机了也没事,session照样在。

 

问题:程序需要定制;每次请求都进行数据库读写开销不小,另外数据库是一个单点,可以做数据库的hash来解 决这个问题。       

2:使用 memcached来保存session, 这种方式跟数据库类似,内存存取性能比数据库好很多。

问题:程序需要定制,增加 了工作量;存入memcached中的数据都需要序列化,效率较低,断电或者重启电脑容易丢失数据;

 

3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建session。简单,高效, 服务器的压力减小了,因为session数据不存在服务器磁盘上。根本就不会出现session读取不到的问题。

正则表达式

匹配中文字符的正则表达式: [\u4e00-\u9fa5] 
匹配双字节字符(包括汉字在内):[^\x00-\xff] 
匹配空行的正则表达式:\n[\s| ]*\r 
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\s*)|(\s*$) 
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

 

 

posted @ 2015-09-22 15:49  归什么归  阅读(94)  评论(0编辑  收藏  举报