分享

PHP and MySql 开发

 马超读书的季节 2016-05-04
php和mysql都是如今比较流行的开源技术,而且他们都便于使用、运行速度快且功能十分强大的免费软件包,非常适合开发面向数据库的web应用程序

php是一种服务器端解释的脚本语言,它是和html脚本融合在一起,并内置有访问数据库的功能。

mysql是基于sql的、完全网络化的跨平台关系型数据库系统,同时是具有客户端服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性高等优点,用户可利用许多语言编写访问mysql数据库的程序。

本书将php开发和mysql应用相结合,分别对php和mysql做了深入浅出的分析。在介绍了php和mysql的一般概念后,本书还对php和mysql的web应用程序做了比较全面的概述,最后是几个金典且使用的例子。


前言
欢迎来到php和mysql web开发的世界。在本书中,你将学习我们在使用php和mysql中得到的经验精华。同时,php和mysql也是目前最热门的两个web开发工具。
为什么学习本书
使用本书将学习到那些知识
php和mysql都是什么及其伟大之处
php和mysql最新版本的变化
本书的组织结构

什么么要学习本书
使用本书将学习到那些知识
什么是PHP
MYSQL是什么
为什么使用PHP和MYSQL
PHP的一些优点

本书的组织结构
   使用PHP 
   使用MYSQL
   电子商务与安全性
   PHP

空格
间隔字符,例如换行-回车、空格、tab-制表符,都被认为式空格。php引擎和浏览器都会自动忽略空格。


注释
对于阅读代码人的来说,注释其实相当于代码的解释和说明。注释可以用来解释脚本的用途,脚本编写人,为什么要按如此的方法编写代码,上一次修改时间等。
php支持c c++ shell风格的注释
c的注释风格  /**/
c++的注释风格 //
shell的注释风格 #
无论任何风格的注释,在注释符号 # //之后行结束之前,或php结束标记之前的所有内容都是注释


添加动态内容

插值操作知识双引号引用的字符特性之一。你能像这一个变量名称方之中爱一个单引号中的字符串。


字符串的方法  heredoc语法  <<<   式插补的。

理解标识符
标识符是变量的名称。 函数和类的名称也是标识符  关于标识符,php定义了一些简单的规则
标识符可以使任意的长度,而且可以由任何字母 数字 下划线组成
标识符不能以数字开始
在php中,标识符是区分大小写的。交替的使用这些标识符是常见的变成错误。对于这个规则,函数名称是个例外--函数名称可以使任意大小写的。
一个变量名称可以与一个函数名称相同。这一点容易造成混淆,虽然允许,应该尽量避免。此外,不能创建一个具有与已有函数同名的函数。

PHP的特性之一就是它不要求在使用变量之前声明变量。第一次给一个变量赋值时,你才创建了这个变量
检查变量类型
变量类型是指能够保存在该变量中的数据类型。php提供了一个完整的数据类型集
不同的数据可以保存在不同的数据类型中

php的数据类型
支持如下的基本数据类型
integer 整数   用来表示整数 
float   浮点数 用来表示所有实数
string 字符串  用来表示字符串
boolean  布尔值 用来便是true false
array    数组   用来保存具有相同类型的多个数据项
object   堆箱   用来保存类的实例

此外还有两个特殊的类型  null   resource 资源。没有被赋值、已经被重置或者被赋值为特殊值null 的变量就是null类型的变量。

类型转换
使用类型转换,可以讲一个变量或值转换成另一种类型。这种转换与c语言的类型转换是相同的。只需在希望进行类型转换的变量之前的圆括号中插入需要转换的临时数据类型即可

可变变量
php提供了一种其他类型的变量 --- 可变变量。可变变量允许我们动态的该笔汗一个变量的名称。
这一特性的工作原理是用一个变量的值作为另一个变量的名称。

声明和使用常量
我们可以改变保存在一个变量中的值。我们也可以声明常量,一个常量可以保存一个值,正如一个变量值,但是常量值一旦被设定后,在脚本的其他地方就不能再更改了。
请注意,常量名称都是由大写字母组成的。这是借鉴了C语言的惯例,这样就可以很容易分别变量和常量。这个惯例并不是必须的,但是它却可以使代码变得更容易阅读和维护。
常量和变量之间的一个重要不同点在于引用一个常量的时候,它前面并没有美元符号

除了可以自定义常量外,php还预定义了许多常量,

变量和常量的另一个差异在于常量只可以保存布尔值、整数、浮点数或字符串数据。这些类型都是标量数据。

理解变量的作用域
作用域指在一个脚本中某一个变量使用或可见的范围。PHP具有6项基本的作用域规则
1.内置超级全局变量可以在脚本的任何地方使用和可见
2.常量,一旦被声明,将可以在全局可见,也即是说,他们可以在函数内外使用
3.在一个脚本中声明的全局变量在整个脚本中是可见的,但不是在函数内部
4.函数内部使用的变量声明为全局变量时,其名称与全局变量名称一致
5.在函数内部创建被声明为静态的变量无法在函数外部可见,但是可以在函数的多次执行过程中保持该值。
6.在函数内部创建的变量对函数来说是本地的,而当函数终止时,该变量也就不存在了。

算数操作符
算数操作符非常直观   他们就是常见的数学操作符
+ - * / % 加 减 乘 除 取余
应该注意到,算数操作符通常用于整形或双精度类型的数据。如果将他们应用于字符串,php会试图将这些字符串转换成一个数字。如果其中包含e或E字符,它就会被当作是科学计数法并被转换成浮点数,否则将会被转换成整数。php会在字符串开始处寻找数字,并且使用这些数字作为字符串的值,如果没有找到数字,该数字的值则为0

字符串操作

赋值操作符

前置递增递减和后置递增递减运算符

所有递增递减操作符都有两个功能 
将变量增加1后再将值赋值给原变量

$a = 4;

echo ++$a;

前置递增的原理是,给变量加一,然后返回值。
后置递增的原理是,返回变量值,然后给变量加一。

引用操作符
引用操作符&可以在关联赋值中使用。通常,在将一个变量的值赋给两一个变量的时候,先产生原变量的一个副本,然后再将它保存在内存的其他地方。
引用类似一个别名
比较操作符
比较操作符用来比较两个值

等于操作符
相等的比较操作符==允许测试两个值是否相同。

其他操作符
php还支持其他比较操作符
恒等操作符 === 
只有恒等操作符两别的操作数相等并且具有相同的数据类型时,其返回的值才是true

三元操作符
三元操作符类似与条件语句if else 的表达式版本

错误一致操作符
错误一致操作符   @  ,可以在任何表达式前面使用,即任何有值得活着可以计算出值得变大时之前

执行操作符
执行操作符实际上是一对操作符,他是一对反向单引号。php试图将反向单引号之间的命令当作服务器端的命令行来执行。表达式的值就是命令的执行结果。

数组操作符
数组元素操作符[],允许访问数组元素

类型操作符
instanceos

理解操作符的优先级和结合性
一般的说,操作符具有一组优先级,也就是执行他们的顺序
操作符还具有结合性,也就是同一优先级的操作符的执行顺序。这种顺序通常从左到右或者从右到左活着不相关

print 和 echo 。print 和 echo 都不是真正的函数,但是都可以使用带有参数的函数形式进行调用。二者都可以作为一个操作符,只要将显示的字符串放在echo 或者 print关键字之后 以函数形式调用print将其返回一个值 1 。如果希望在一个更复杂的表达式中生成输出,这个功能是有用的,但是print要比echo的速度慢。

使用可变函数
在我们结束对变量和操作符的介绍之后,还要了解一些PHP中右两个最常见的函数,分别是gettype()  settype()  这两个函数有如下的函数原型,通过他们可以获得要传递的参数和返回的结果

php还提供了一些特定类型的测试函数。每一个ie函数都是使用一个变量作为其参数,并且返回true false。这些函数如下

is_array   
is_double is_float  is_real 相同的函数 检查变量是否是浮点数
is_long ig_int  is_integer  相同的函数 检查变量是否是整数
is_string
is_bool
is_object
is_resource
is_null
is_scallar
is_numberic  是否是任何类型的数字或者数字字符串
is_callable检查变量是否是有效的函数名称


检测变量状态
php有几个函数可以用来检测变量的状态。第一个函数就是isset
如果变量存在,则返回true,否则返回false
对应的函数unset函数来销毁一个变量
empty函数检查一个变量是否存在,以及它的值是否为非空或非0,相应的返回true 或 false

变量的重解释
可以通过调用一个函数来实现转换变量数据类型的目的

intval
floatval
strval
每个函数都需要接受一个变量作为其输入,然后将变量值转换成适合当类型返回

根据条件进行决策
控制结构是一个程序语言中用来控制一个程序或脚本执行流程的结构,可以将他们分类为条件结构或重复结构
如果我们希望有效的相应用户的输入,代码就需要具有判断能力。能够让程序进行判断的结构成为条件。

通过迭代实现重复动作
计算机非常擅长的一件事就是自动地、重复地执行任务。如果某些任务需要以相同的方式多次执行,可以使用循环语句来重复程序中的某些部分

bob希望在客户订单汇总加入一个运费表。对于bob所使用的送货人来说,运费的多少取决于包裹要运送的距离

从控制结构或脚本中跳出
如果希望停止一段代码的执行,根据所需要达到的效果不同,可以由3中方法来实现
如果希望终止一个循环,可以使用break
如果希望调到下一次循环,可以使用continue
如果希望结束整个脚本的执行,可以使用exit die


数据的存储与检索
我们已经了解了如何访问和操作输入到HTML表单的数据,现在可以开始了解如何保存这些信息以备后期使用。在大多数的情况下,包括上一章介绍的例子,我们需要将数据存储起来并且以后使用

保存数据以便后期使用
存储数据有两种基本方式 保存到普通文件 或者保存到数据库中
普通文件可以具有多种格式,但是,通常指的是简单的文本文件。这这个例子中我们将顾客的订单写到一个文本文件中,一个订单占据一行的位置
这样保存起来非常简单,但是也存在一定的局限性,我们将在本章的后续内容中介绍其局限性。如果要处理相当数量的信息,很可能会想到使用数据库来替代他。但是,普通文件尤其自己的用途,在某些情况下需要了解如何使用它们
文件的读写操作与大多数的文件读写操作是类似的。如果读者编写过c语言或者unic shell脚本,就会非常熟悉这些操作

存储和检索bob的订单
在本章中,我们将使用上一章所介绍 的订单的改进版本。我们将从这个表单开始,编写一些php代码来处理订单数据
我们看到这个修改过的表单
送货地址表单域成为adress。这又给我们增加了一个变量,根据表单提交的method不同,我们可以通过$_REQUEST 访问这个变量
文件处理
将数据写入一个文件,有以下3步操作
打开这个文件,如果文件不存在,需要创建它
将数据写入这个文件
关闭这个文件
同样的,从一个文件中读取数据,也有以下3个操作
打开这个文件,如果这个文件不能打开例如不存在,就应该意识到这一点并正确退出
从文件中读取数据
关闭这个文件
当希望从一个文件中读出数据时,可以选择一次从文件读取多少数据。我们将详细介绍一些常见的选择。现在,我们打开文件开始

打开文件
要在php中代开一个文件,可以使用fopen()函数。当打开一个文件的时候,换需要制定如何使用它,这就是文件模式
选择文件模式
服务器上的操作系统必须知道要对代开的文件进行什么操作。操作系统需要了解在打开这个文件号,这个文件是否还允许其他脚本打开,他还需要了解使用者是否具有在这种方式向下使用该文件的权限。从本质上说,文件模式可以告诉操作系统一种机制,这种机制可以决定如何处理来自其他人或脚本的访问请求,以及一种用来检查你是否有权访问这个特定文件的方法

打开一个文件为只读 只写 或者读和写
如果要写一个文件,你可能希望覆盖已有的文件内容,或者仅仅将新数据追加到文件末尾。如果该文件已经存在,也可以终止程序的执行而不是文件
如果希望在一个区分二进制方式和存文本方式的系统上写一个文件,还必须制定采用的方式
函数fopen支持以上3中方式的组合
使用fopen()打开文件
假设讲一个顾客订单写入bob的订单文件中,可以使用如下所示的语句打开着这个文件
$fp = fopen("$DOCUMENT_ROOT/../orders/odders.txt" , "w");

调用第一个参数是要打开的文件。正如以上代码所示,可以指定该文件的路径---在这里orders.txt文件保存在odders目录中。我们已经使用php内置变量。由于整个表单变量名称太长了,我们可以指定一个简短的名称
这个名称指向web服务器文档树的根 我们使用..表示文档根目录的父目录。处于安全的考虑的原因,这个目录位于整个文档树的外部。在这个例子中,除了通过我们所提供的接口外,我们不希望还又其他web借口能访问它。这个路径成为相对路径,因为它描述了一个相对文档根目录的文件系统位置

由于我们为表单变量定义了简短的名称,我们需要在脚本的开始出加上如下代码

$DUCOMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
将冗风格变量内容复制给简短风格的变量名称
就像有不同的方法可以访问表单数据一样,也可以使用不同的方法访问预定义的服务器变量,根据服务器设置不同,可以通过如下3中方式得到文档根目录

$_SERVER['DUCOMENT_ROOT']
$DUCUMENT_ROOT
$HTTP_SERVER_VARS['DOCUMENT_ROOT']
对于表单数据,第一种风格是首选的


我们还可以指定文件的绝对路径。这个路径是从根目录开始的,而在windows系统从,通常是c:\。在unix服务器中,根目录是/home/book/orders。这样做的问题在于,特别是如果将网站安装在别人的服务器上,这个绝对路径可能会改变。我们曾经有过称重的教训,如果系统管理员没有发出任何通知就决定修改目录结构后,我们就不得不手工更改保函在大量脚本中的绝对路径。
如果没有指定路径,这个文件就会在脚本自身所在的相同目录中查找或者创建。如果通过某种cgi封装程序来运行php的,这可能又会有所不同,具体需要根据服务器的设定而定
在unix环境下,目录中的间隔符是正斜线,如果你使用的是windows平台,可以使用正斜线或者反斜线。如果使用反斜线,就必须使用转义字符,这样fopen函数才能正确理解这些字符。要转义一个字符,只需要简单的在前面前加一个反斜线。如下代码所示
在phpdiamante中,只有少数人使用反斜线,因为这一威慑只能在windows上运行
如果使用正斜线,代码不需要任何修改就可以在windows和unix机器上运行
fopen函数的第二个参数是文件模式,他是一个字符串,指定可将对机器文件进行的操作。

通过ftp或http打开文件
除了打开一个本地文件进行读写操作之外,也可以使用fopen函数通过ftp http或其他协议来打开文件。在php.ini文件中,可以通过关闭 allow_url_fopen指令来禁止这一个功能,如果在使用该函数打开一个远程文件时遇到问题,请检查php.ini文件
如果使用http打开一个文件名是http://开始的fopen函数将建立一个到指定服务器的被动模式,并返回一个纸箱文件开始的指针
如果使用的文件名是以http://开始的,fopen函数将建立一个到指定服务器的http链接,并返回一个纸箱http相应的指针。当使用php早期版本的http模式时,必须在目录后添加结束斜线
当使用一个地址形式 不带斜线时,web服务器通常会使用http重定向到第一个地址 带斜线的地址
请记住,url中的域名不区分大小写,但是路径和文件名可能会区分大小写
解决打开文件时可能遇到的问题
当打开文件时,可能经常遇到的错误是试图打开一个没有权限进行读写操作的文件 这种错误通常只会在类似unix的操作系统见到,但是偶尔也会在windwos平台上遇见

如果遇见这样的问题,必须确认运行该脚本的用户是否有权访问要使用的文件。根据服务器设置的不同,该脚本可能是作为web服务器用户或者脚本所在目录的拥有者来运行的

请注意,任何人可写的目录和文件是非常危险的。不应该具有可以从web上直接可写的目录,正式这个原因,orders目录是两个子目录,都在public_html目录上的。
设置不正确的权限可能是打开文件出现错误的常见原因。如果文件不能打开,你需要知道这一点,这样就不会去读写数据
如果fopen函数调用失败,可以以一种对于用于友好的方式来处理这个错误,可以通过抑制php的错误信息并且根据自己的方式给出错误信息

fopen函数前调用@符号可以告诉php抑制所有由该函数所产生的错误。通常,在出现错误的时候,这是一个不错的方法,但是没在这种情况下,要在其他地方处理它

用自己的错误信息替代php的错误信息可以使得用户觉得更加友好

写文件
在php中写文件相对比较简单。可以使用fwrite函数 或者fputs,这两个函数类似
fwrite($fp , 'asdadadada')
这个函数告诉php保存在$outputstring中的字符串写入到$fp纸箱的文件中。
fwirite函数的一个替换函数是file_put_contents fputs
file_get_contents函数当使用ftp或者http向远程文件写入数据时,最常用的可选参数flags context
实际上fwrite函数有三个参数,第三个参数是可选的 第三个参数length是写入的最大字符数。如果给出了这个参数,fwrite将向handle纸箱的文件写入字符串,一直到写到字符串的末尾或者已经写入了length字节,满足这两个条件之一就停止写入
当使用二进制模式执行写操作的时候,你可能希望使用第3个参数,因为它可以帮组你避免一些跨平台的兼容性问题
文件格式
当创建一个如我们例子中使用到的数据文件时,保存数据的格式将完全由你决定。然而,如果打算在另一个应用程序中使用这个数据文件,你可能就不得不遵循那个应用程序员的规则
关闭文件
当使用完文件后,应该将其关闭,应该按照如下的所示的方式调用fclose函数
如果该文件被成功关闭,函数返回一个true值,反之,函数返回一个false。通过漫长,关闭文件的操作不像打开文件那个容易出错,,所以子啊这个例子中我们并没有对该文件进行测试
知道何时读完文件feof
在这个例子中,使用while循环来读取文件内容,知道文件结尾。这个while

file end of file 
每读取一行数据 fgets  fgetss fgetcsv


查看文件是否存在 file_exists

确定文件的大小 filesize

删除一个文件 unlink

在文件中定位
rewind fseek ftell
可以使用rewind  fseek  ftell函数对文件指针进行操作或者确定发现他在文件中的位置

rewind函数可以讲文件指针复位到文件的开始  ftell函数可以以字节为单位报告文件指针当前在文件总的位置 
fseek函数将文件指针指向文件的某个位置
位  0  或者 1表示一个位
字节   8个位
字     16个位

文件锁定
假设遇到这种情况,两个客户试图同时订购同一件商品,这种情况并不少见,尤其是当网站上遇到某种程度的网络堵塞的时候。如果一个客户调用fopen函数打开一个文件并且开始写这个文件,而此时其他客户也调用了fopen函数打开这个文件并且写这个文件,将会出现什么情况,文件的最终内容是什么回事第一个订单后面的就是第二个订单吗还是恰好相反呢,文件的最终内容是什么,回事第一个订单后面就是第二个客户吗或者将变成一些没用的东西,就像两个订单交错在一起,这些问题的答案啊取决于操作系统,但是,通常都是不可知的
为了避免这样的问题,可以使用文件锁定的方法,在php中,文件锁定是通过flock函数来实现的,当一个文件被打开并且在进行读写操作之前,应该调用这个函数
flock函数的原型如下所示
必须讲一个被打开文件的指针和一个表示所需锁定类型的常数作为参数传递给这个函数。如果文件锁定成功,起返回值为true,否则false。如果获得文件锁定将导致当前进程被柱塞如果打算使用flock函数,必须将其添加到所有使用文件的脚本中,否则,就没有任何意义
LOCK_SH 读写锁定  
LOCK_EX 写操作锁定
LOCK_UN 释放已有的锁定
LOCK_NB 阻止在请求枷锁的时发生阻塞
更好的方式 数据库管理系统
使用普通文件的几个问题
当文件变大时,使用普通文件将会变得非常慢
在一个普通文件中查找特定的一个或者一组记录会非常困难

使用数组
本章将介绍如何使用一个重要的变成结构  数组  在前面的章节中,我们介绍的变量都是标量,这些变量只能存储字单个数值。数组是一个任何存储一组或一系列数值的变量,一个数组可以具有许多个元素。每个元素有一个值,例如文本 数字 或另一个数组,一个包含其他数组的数组成为多维数组
php支持数字索引数组和关联数组。如果曾经使用过任何其他编程语言,你可能熟悉数字索引数组,但是如果你没有使用过php或perl,五落实曾经使用过hash map或dictionary队形,你可能就从来没有见过关联数组。关联数组允许你使用更有意义的数据作为索引。每个元素除了可以使用数字索引外,还可以使用其他有意义的信息作为索引
数字索引数组
飞数字索引数组
数组操作符
多维数组
数组排序
数组函数

什么是数组
一个标量变量就是一个用来存储数字的命名区域。同样的,一个数组就是一个用来存储一系列变量值的命名区域,因此,可以使用数组组织标量变量
拥有数组信息后,就可以用它完成很多有用的事情。可以完成针对数组中每个值的相同操作,这样就可以节省很多工作。数组信息的整个集合可以作为一个单元进行移动。通过这种方式,只要使用一行代码,所有数组就可以传递一个函数。例如,希望按字母顺序对产品进行排序。要完成此操作,可以讲整个数组传给php的sort函数
存储在数组中的值成为数组元素。每个数组元素有一个相关的索引 也成关键字,他们用来访问元素,在大多数变成语言中,数组都具有数字索引,而且这些索引通常都是从0或1开始的。
php允许间隔性地使用数字或字符串作为数组的索引。可以讲数组的索引设置为传统的数字型,也可以将索引设置为任何希望的索引,这样可以使用所以更有意义和有用。根据是否使用标准数字索引数组或更有趣的索引值的不同,变成方法也不相同

数字索引数组
php中,数字索引的默认值是从0开始的,当然也就可以改变他

range 也可以对字符串进行操作
如果信息保存在磁盘中,可以从这个文件直接载入到数组中。如果数组中使用的数据保存在数据库总,可以从数据库中直接载入数组
还可以使用不同的函数来提取数组中的一部分数据,或对数组进行重新排序

访问数组的内容
要访问一个变量的内容,可以直接使用其名称,。如果该变量是一个数组,可以使用变量名称或关键字或索引的住宿来访问其内容。关键字或索引将指导要访问的变量。索引在变量名称后面用方括号括起来
使用$products[0] 
在默认情况下,0
元素是数组的第一个元素
请注意,虽然php的字符换解析功能非常强大和机智,但是可能回忆起混淆。当你将数组或者其他变量嵌入到双引号中的字符串时,如果不能解释他们,可以将他们放在双引号之外或者使用更复杂的语法。

使用循环访问素组
由于数组使用有序的数字作为索引,所以使用一个for循环可以很容易的额显示数组德内容
使用不同索引的数组
在$products数组中,允许php为每一个元素指定给一个默认的索引,这就意味着,所添加的第一个元素为元素0,第二个为元素1。php还支持关联数组,在关联数组中,可以讲每个变量值与任何关键字或索引关联起来

多维数组
数组不一定是一个关键字和值得简单列表---数组中的每个位子还可以保存另一个数组。使用这种方法,可以创建一个二维数组。可以把二维数组当成一个矩阵,或者一个具有宽高的网络
数组排序
对保存在数组中的相关数据进行排序是一件非常有意义的事情。使用并且排序一个一维数组是非常简单的
使用sort函数
对一维数组的值进行升序排序 按照字母  或数字

使用asort函数 和 ksort函数对关联数组进行排序
如果用关联数组存储哥哥项目和他们的价格,就需要用不同的排序函数使得关键字和值在排序时任然保持一致


反向排序
你已经了解了sort asort ksort 这3个不同的排序函数都使数组按升序进行排序。他们每个都对应有一个反向排序的函数,可以讲数组按从大到小进行排序。实现反向排序的函数是rsort arsort krsort


多为数组的排序
对于一维数组进行排序,或者不按照字母和数字的顺序呢进行排序,要复杂的多。php知道如何比较两个数字和字符串,但在多维数组中,每个元素都是一个数组。php不知道如何比较两个数组,所以需要建立一个比较他们的方法。在大多数的情况下,单词和数字的顺序是显而易见的 -- 但对于复杂的对象,问题会更多一些

用户自定义排序

对数组进行重新排序
在一些营养程序中,可能希望按另一种方式对数组排序。函数shuffle将数组个元素进行随机排序。函数array_reverse给出一个原来数组的反向排序
执行其他数组操作
到目前为止,大概介绍了一半的php数组处理函数。此外,还又很多其他函数有时也非常有用。接下来,将详细介绍他们
在数组中浏览 
each  current reset  end  next  pos  prev

对数组的每一个元素应用任何函数 array_walk

有时候 读者可能希望帮助想用方式使用或者修改数组中的每一个元素  array_walk函数允许进行这样的操作

统计数组元素个数 count  sizeof   array_count_values
已经使用函数count对订单数组中的元素个数进行统计。函数sizeof有相同的用途。这两个函数可以返回数组元素的个数。可以得到一个常规标量变量中的元素个数,如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组元素个数就是0

将数组转换成标量 extract
对于一个非数字索引数组,而该数组有很多关键字值对,可以使用函数extract将他们转换成一系列的标量变量
函数extract的作用是通过一个数组创建一系列的标量标量,这些变量的名称必须是数组中关键字的名称,而变量值则是数组中的值

字符串操作与正则表达式
在本章中,我们将讨论如何使用php的字符串函数来格式化和操作文本我们还将介绍使用字符串函数或正则表单时来搜索  替换单词 、短语 或字符串中的其他模式

在许多情况下,这些函数都是非常有用的。通常,你会希望整理或重新格式化将要存入到数据库中的用户输入信息。当需要创建搜索引擎应用程序时,搜索函数兼职棒极了

字符串的格式化
字符串的链接和风格
字符串的比较
使用字符串函数匹配和替换字字符串
使用正则表达式


用字符串函数连接和分隔字符串
通常,我们想查看字符串的各个部分例如,查看句子中的单词或者要讲一个域名或电子分隔为一个个组件部分。php提供了几个字符串函数 来实现这些功能
在我们的例子中,bob想让顾客的反馈信息直接从bigcustomer.com提交到他那里,所以,可以讲客户端输入的电子邮件地址分为几个部分,以便判断是否为大客户

使用函数explode  implode  join
为了实现这个功能,我们将使用的第一个函数是explode,该函数原型如下所示
这个函数带有一个输入字符串作为参数,并根据一个指定的分隔符串将字符串本身分为小块,将分割后的小块返回到一个数组中,可以通过可选的参数limit来限定分成字符串小块的数量

使用implode 或join函数来显示与函数explode函数相反的效果,这两个函数的效果是一致的。
以上代码的是从email_array中取出数组元素,然后用第一个传入的参数字符串将他们连接在一起。这个函数的调用同explode十分相似,但效果却相反

使用strtok函数
与函数explode的每次都讲一个字符串全部分隔成做干哥小块不同,strtok函数一次只从字符串中取出一些片段 成为令牌 。对于一次从字符串中取出一个单词的处理来说,strtok函数比explode函数的效果更好

分隔符可以是一个字符,也可以是一个字符串名单是,需要注意的是,输入的字符串会根据分隔符中每个字符串来进行分割,而不是根据每个分隔符来分割的就像expolde函数一样

使用substr函数
函数substr允许我们访问一个字符串给定七点和终点的子字符串。这个函数并不适合用于我们的例子中,但是,当需要得到一个固定格式字符串中的一部分,它会非常有用的

substr
这个函数将返回字符串的字符串副本

如果用一个正数作为字符串起点来调用这个函数,将得到从起点到字符串结束的整个字符串。例如
strsub 字符串的起点和数组一样是从零开始的
如果只用一个负数作为子字符串起来来调用它,将得到一个源字符串尾部的子字符串,字符串个数等于给定附属的绝对值

length参数可以用与指定返回字符串的个数,如果它是正数,或是字符串序列的尾部 如果它是负数   
返回

字符串的比较
到目前为止,我们已经用过==好来比较两个字符串是否相等,使用php可以进行一些更复杂的比较,这些比较分为两类:部分匹配和其他情况。在者流,我们首先讨论一些其他情况,然后在讨论在进一步smart例子 只能表单邮件中要用到的部分匹配

字符串的排序  strcmp   strcasecmp  strnatcmp函数可用于字符串的排序。当进行数据排序的时候,这些函数是非常有用的额
使用strlen函数测试字符串的长度
可以使用函数strlen来检查字符串的长度。如果传给一个字符串,这个函数将返回字符串的长度。这个函数可以用来验证输入的数据,考虑一席按我们的表单中的电子邮件地址,它存储在变量
中,检验一个保存在变量中的电子邮件地址的基本方法就是检查他的长度。根据推理,如果一个国家的diamante没有耳机域名,只有一个字,字母的服务器名称和一个字母的电子邮件地址,那么他的最小长度是6个字符,因此,如果一个地址没有达到这个长度就会报错
很明显,这是一个验证信息是否有效的简单方法
使用字符串函数匹配和替换子字符串

通常,我们需要检查一个更长的字符串中是否含有一个特定的字符串,这种部分匹配常闭测试字符串的完全等价更有用
在只能表单例子中,我们希望根据返回信息中的一些关键字来将他们发送到适合的部门
我们需要在信息总找到shop或者他的派生词
在了解前面介绍的函数后,就可以使用函数explode 和strtok在消息中检索每个单词,然后通过运算符== 或者strcmp对他们进行比较
然后,还可以调用一个字符串函数或正则表单时匹配函数来完成相同的操作。这些函数可以用于一个字符串中搜索一个模式。稍后,我们介绍这些函数

在字符串中查找字符串strstr  strchr strrchr stristr
为了在一个字符串中查找两一个字符串,我们可以使用函数strstr strchrstrrchr stristr中的任意一个
函数strstr最常见,他可以用于在一个较长的字符串中查找匹配的支付后春或字符
请注意,在php中,函数strchr、和strstr完全一样,虽然函数的名疑似是在一个字符串中查找一个字符,类似
C语言中的同样函数,在php中,这两个函数都可以用于在字符串中查找一个字符串,包括查找只包含一个字符串的字符串
strstr()的函数原型如下所示
string strstr(string haystack, string needle) 你必须向函数传递一个要搜索的子字符串参数和一个目标关键字字符串参数,如果找到一个目标关键字的一个精确匹配,函数会从目标关键字前面返回被搜索的字符串,否则返回值为false。如果存在不止一个目标关键字,返回的字符串从出现的第一个目标关键字的位置开始.
首先,这段代码将检查反馈信息中特定的关键字,然后将邮件发送给适当的人。例如,如果客户的反馈信息是,以上diamante就讲找到字符串delivery,这样的反馈信息就讲被送给fulfillment@example.com
函数strstr有两个变体。第一个是stristr(),它几乎和strstr()一样,其区别在于不区分大小写。对于我们的智能表单应用程序来说,这个函数非常有用,因为用户可以输入一起其他大小写混合的情况。第二个变体是strrchr(),它也几乎和strstr()一样,但是会从最后出现关键字的位置的前面返回被搜索的字符串
查找子字符串的位置 strpos() strrpos()
函数strpos() 和 strrpos()的操作和strstr()雷士,但他不是返回一个子字符串,而返回目标关键字字符串在字符串中的位置。更有趣的是,现在的php手册中建议使用strpos()函数代替strstr()函数来查看一个自字符喜欢在一二字符串中出现的位置,因为前者额运行速度更快。
函数strpos()的原型如下
int strpos(string haystack, string needle, int [offset]) 返回的证书代表被搜索字符串中第一个出现目标关键字子字符串的位置。通常,第一个字符串的位置是0
函数strrpos()也几乎是一样的,但返回的是被搜索字符串中最后一次出现目标关键字子字符串的位置
在任何情况下,如果目标关键字不在字符串中,strpos 或者strrpos都将返回false。因此,这就可能带来新的问题,因此false在一个如php这样的弱类型语言中等于0,也就是说字符串的第一个字符
可以使用运算符 === 来测试返回值,从而避免这个问题
if( strpos(haystack, string) === false){
echo 'false';
} else {
echo 'true';
}
替换子字符串 str_replace()  substr_replace()
查找替换功能在字符串中非常有用。可以使用查找替换从而通过php生成个性文档 用人名来替换 <name> ,用他们的地址来替换<address>,也可以通过使用这项功能来删改特定的术语,例如在一个论坛应用程序中,或是在智能表单应用程序中。需要再次提到的是,可以用字符串函数或者正则表达式函数来实现此功能
进行替换操作最常用的字符串函数是str_replace(),它的函数原型如下所示
mixed str_replace( mixed needle, mixed new_needle, mixed haystack[, int &cout] )
这个函数用new_needle替换所有haystack中的needle,并且返回 haystack替换后的结果。可选的第四个选项是count,它包含了要执行的替换操作次数。
提示 你可以以数组的方式传递所有参数,该函数可以很好的完成替换。可以传递一个要被替换单词的数组,一个替换单词的数组,以及应用这些规则的目标字符串数组。这个函数讲返回替换后的字符串数组。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多