php字符串处理函数库

 

AddSlashes:字符串加入斜线。
bin2hex:二进位转成十六进位。
Chop:去除连续空白。
Chr:返回序数值的字符。
chunk_split:将字符串分成小段。
convert_cyr_string:转换古斯拉夫字符串成其它字符串。
crypt:将字符串用 DES 编码加密。
echo:输出字符串。
explode:切开字符串。
flush:清出输出缓冲区。
get_meta_tags:抽出文件所有 meta 标记的资料。
htmlspecialchars:将特殊字符转成 HTML 格式。
htmlentities:将所有的字符都转成 HTML 字符串。
implode:将数组变成字符串。
join:将数组变成字符串。
ltrim:去除连续空白。
md5:计算字符串的 MD5 哈稀。
nl2br:将换行字符转成 <br>。
Ord:返回字符的序数值。
parse_str:解析 query 字符串成变量。
print:输出字符串。
printf:输出格式化字符串。
quoted_printable_decode:将 qp 编码字符串转成 8 位字符串。
QuoteMeta:加入引用符号。
rawurldecode:从 URL 专用格式字符串还原成普通字符串。
rawurlencode:将字符串编码成 URL 专用格式。
setlocale:配置地域化信息。
similar_text:计算字符串相似度。
soundex:计算字符串的读音值
sprintf:将字符串格式化。
strchr:寻找第一个出现的字符。
strcmp:字符串比较。
strcspn:不同字符串的长度。
strip_tags:去掉 HTML 及 PHP 的标记。
StripSlashes:去掉反斜线字符。
strlen:取得字符串长度。
strrpos:寻找字符串中某字符最后出现处。
strpos:寻找字符串中某字符最先出现处。
strrchr:取得某字符最后出现处起的字符串。
strrev:颠倒字符串。
strspn:找出某字符串落在另一字符串遮罩的数目。
strstr:返回字符串中某字符串开始处至结束的字符串。
strtok:切开字符串。
strtolower:字符串全转为小写。
strtoupper:字符串全转为大写。
str_replace:字符串取代。
strtr:转换某些字符。
substr:取部份字符串。
trim:截去字符串首尾的空格。
ucfirst:将字符串第一个字符改大写。
ucwords:将字符串每个字第一个字母改大写。

 

 

 

 

 

自己写的php一个数字数组排序

<?php
/**
* @数字数组排序 可按从大到小或从小到大排序
*/

function sortArray($array,$choice){
 
 $values = array_values($array);//建立一个数字索引的数组
 $ch=$choice==0?min:max;//参数$choice为0按从小到大排列,否则其他都默认为按从大到小
 do {
  $val = $ch($values);//找出最大或最小值
  $key = array_search($val,$values);//取得最大值的键名
  $result[$key] = $val;//将最大值存入新数组
  unset($values[$key]);
 }while (count($values)>0);
 return $result;
}

//$array = array(100,1000,1,10000);
//$array = sortArray($array,0);
//$array = sortArray($array,1);
//foreach($array as $a){
// echo "$a ";
//}
?>

标签: 数组, 排序

PHP效率开发--数组中的引号

 

PHP效率开发--数组中的引号

数组概述

       数组,作为一种简单的线性数据结构,在程序开发的过程中时常会被用到。PHP将数组分为两类:数值数组和关联数组。

       数值数组和大多数其它语言的使用方法一样:在一对中括号中加上一个数字表示要存取的值在数组中的存放位置。例如:$array[0] = ”value”。

       关联数组是PHP的一大亮点,它通过使用字符串来索引数组,例如在某个水果销售系统中,我们要为几种水果指定价格,于是我们可以这样写:$price[‘Apple’] = 1.8; $price[‘Banana’] = 4.6; $price[Pear] = 2.8; $price[Other] = 0.5; 。

 

问题出现

       从上面的例子可以看出关联数组使得我们的代码更加清晰,同时在很大程度上提高了开发效率。细心的可能会发现在我们举例关联数组时,前两个数组中(Apple和Banana)的字符串索引我们加上了单引号,而后面两个(Pear和Other)则没有!是的,为了提高开发效率,PHP允许我们在使用关联数组时不必给数组的索引字符串加上引号。这确实给我们带来了很大的方便:首先PHPer不必在每次写数组时都要记得加上烦人的引号;其次可以避免引号配对问题。不过这带来了另外的一个问题――性能。在接下来的文章中我们将通过例子来解释这个现象。

性能测试

性能和效率之间似乎总是呈反比的,有时为了效率我们必须牺牲性能,有时有不得不反过来,不过在这里我们应该选择哪个呢?先看下面的代码:

 


<?

       //定义一个存放临时数据的文件

       $fp=fopen('delete.txt','w');

       //初始化数组

       $array=array('name'=>'value');

       //定义循环次数

       $LOOPTIMES=100;

       //得到初始时间

       $t0=number_format(microtime(true),10,'.','');

       //循环显示没有使用引号的数组

       for($i=0;$i<$LOOPTIMES;$i++)

              fputs($fp,$array[name]);

       $t1=number_format(microtime(true),10,'.','');

       $rs1=$t1-$t0;

       //循环显示使用了引号的数组

       for($i=0;$i<$LOOPTIMES;$i++)

              fputs($fp,$array['name']);

       $t2=number_format(microtime(true),10,'.','');

       $rs2=$t2-$t1;

//     显示结果

       echo "$t1 - $t0 = ".$rs1." ";

       echo "$t2 - $t1 = ".$rs2." ";

       fclose($fp);

?>

 

上面的代码分别循环100次使用大引号的关联数组和不代引号的关联数组,最后输出它们所消耗的时间。下图显示了允许程序10次后的结果:

 


在10次的测试中,使用引号所花费的平均时间为0.003,而没使用引号的平均时间为0.032911,大约是前者的10倍!

总结

       从上的例子中可以看出:不使用引号的关联数组所带来的优点比较起来其,在关联数组中使用引号将使得程序的性能得到很大的提升。而且由于有了像Zend这样优秀的PHP集成开发环境,它不仅能为PHP字符串自动添加引号,而且配备了出色的代码检查功能。这使得我们更没有理由继续使用没有引号的关联数组。

 

 

 

 

更新:

一定要加引号,如果不加引号,则方括号中是一个常量,PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。
它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。
例如,如果没有常量定义为 anykey,PHP 将把它替代为 'anykey' 并使用之。
 

结果:$arr['a'] 的效率高于 $arr[a];

 

PHP数据类型分为:标量数据类型,复合数据类型,特殊数据类型

数据类型分为:标量数据类型,复合数据类型,特殊数据类型

1.标量数据类型:是数据结构中最基本单元,只能储存一个数据,包括boolean,string,integer,float

1.1string类型:

定义字符串与三种方式:单引号(‘)、双引号(“)、界定符(<<<)单引号和双引号是常使用定义方式,区别是双引号中包含的变量会自动被替换成实际数值,而单引号包含的变量则按普通字符串输出。

<?php

$i="welcome to network1024";

echo '$i';   //将输出$i

echo "$i";   //输出welcome to network1024

?>

 

转义字符:


序列                        含义

\n                            换行

\r                             回车

\t                             水平制表符

\\                             反斜线\

\$                            符号$

\’                             符号’

\”                             符号”

\[0-7]{1,3}               此正则表达式序列匹配一个用八进制符号表示的符号

\x[0-9A-Fa-f]{1-2}   此正则表达式序列匹配一个用十六进制符号表示的符号

注意:\n和\r在windows系统下没区别,都可当回车符;Linux下\n表示光标回到行首,仍在本行,\r则换到下一行,却不会回到行首。

<?php

$i=<<<network1024 //必须另起一行

welcome to network1024

network1024;

echo "$i"; //输出welcome to network1024

?>

1.2integer类型:

32位系统范围:-2147483648~2147483647,如果超出范围发生整数溢出,当float处理,返回float类型;

表示方式:十进制:123;八进制:0123;十六进制:0x123;

1.3float类型:

32位系统范围:1.7E-308~1.7E+308

表示方式:标准格式:3.141592654;科学计数法试:3141592654E-9

注意:浮点数数值只是一个近似值,所以尽量避免浮点数间比较大小,因为最后的结果往往不准确。

 

2复合数据类型:

包括数组array和对象object

数组类型:是一个数据集合,可以包括多种数据:标量数据、数组、对象、资源、及PHP中支持的其他语法结构。

数组中每个数据成为一个元素,元素包括索引(键名)和值两部分。元素索引只能有数字或字符串组成。元素值可以是多种数据类型。

数组索引自动编号从0开始

语法格式:$array=(“value1”,”value2”……)或$array[key]=”value”或$array(key1=>value1,key2=value2……)

<?php

$network1024=array(1=>"how",2=>2,'are'=>"you");

echo $network1024[2]; //输出2

echo $network1024[are]; //输出you

?>

声明数组后,数组中的元素个数可以自由更改。只要给数组赋值,数组就会自动增加长度。

 

3特殊类型:

包括空值NULL和资源resource

resource:资源是由专门的函数来建立和使用的,它是一种特殊的数据类型,并由程序员分配。在使用资源时,要及时释放不需要的资源。如果忘记释放资源,系统自动启动垃圾回收机制,避免内存消耗殆尽。

NULL:表示变量没有值。NULL不区分大小写,null和NULL都是一样。

为NULL的情况:

被赋为null;

尚未被赋值;

通过函数unset()而被销毁。

 

4数据类型转换:

(type)value

类型关键字                  类型转换                      类型关键字                  类型转换

(int),(integer)                 转换成整形                  (array)                          转换成数组

(float),(double),(real)      转换成浮点型               (object)                         转换成对象

(bool),(boolean)             转换成浮点型               (string)                         转换成浮点型

注意:

转换为boolean:null、0、未赋值的变量或数组会转换为false,其他为true

转化为integer:boolean:false为0,true为1

              float:小数部分被舍去

              string:以数字开头则截取到非数字位,否则输出0

 

通过函数bool settpye(mixed var , string type)

var为指定变量;type为要转换的类型boolean/float/integer/string/array/null/object

settype会改变变量自身类型

 

关于js的匿名函数anonymous()

anonymous()   创建高级对象  
   
   
  使用构造函数来创建对象  
  在   Microsoft   JScript   中,可以使用构造函数来创建和生成对象类。您可以使用   new   语句来调用一个构造函数。该语句将返回其创建的内容。    
  Function   构造函数这个特例可用来创建匿名的函数。所谓匿名函数是指没有名称的函数。例如,可以使用   Function   构造函数来生成一个   “不工作”的函数,作为在另一个函数内的指示。这种函数只会从一个位置调用,不需要名称。    
   
  在下例中,这个匿名函数将生成一行“姓名和电子邮件地址”列表。该函数检查   firstNameFirst   变量的值来决定是先输入名还是姓,然后检查   emailNameFirst   变量的值来决定是先输入姓名还是电子邮件地址。该示例假定已在别的位置设置了firstNameFirst   和   emailNameFirst   的值。    
   
  for   (j   =   1;   j   <   addressList[length];   j++)    
  {  
  oneListingLine   =   new   Function(emailNameFirst,   firstNameFirst,   addressList,   j,   theName   =   new   Function(firstNameFirst,   addressList,   j,   var   theName=(addressList[j].firstName   +   addressList[j].lastName);    
  if(firstNameFirst)  
              {  
              theName=(addressList[j].firstName   +   addressList[j].lastName);  
              },)   ;    
  if   (emailNameFirst)    
              {  
  theListing   =   addressList[j].emailName+   ":\t"   +   theName    
              }   else   theListing   =   theName   +   ":\t"   +   addressList[j].emailName;   return   theListing;)  
  document.write(oneListingLine   +   "<br>");  
  }  
   

  编写构造函数  
  要编写自己的构造函数,可以在构造函数中使用   this   关键字来引用新创建的对象。该构造函数将初始化该对象。  
  尽管在下面的示例中构造函数是从   0   索引开始的,但这并不是必需的。例如,如果希望某个参数指明数组或对象的实际索引数,您可以将   1   作为第一个索引开始。   在该示例中,该参数是   extent   来使其区别于由内置的   Array(   )   对象中自动维护的   length   参数。如果编写了给数组添加属性的代码,必需更新   extent   参数(或您自己的对应参数),因为该参数不是由   JScript   维护的。注意即使是这个极端简单的示例也使用了对象(点)和数组(方括号)的标注风格来引用当前对象。    
   
  function   MakeStringArray(length)   {  
  this.extent   =   length;  
  for   (iNum   =   0;   iNum   <   length;   i++)   {  
  this[iNum]   =   "";  
  }  
  }  
   

  //   使用该构造函数来创建和初始化一个数组。  
  myStringArray   =   new   MakeStringArray(63);  
   
  使用原型来创建对象  
  在编写对象定义时,可以使用   prototype   属性来创建由该定义生成且所有对象都具有的属性。原型属性将按引用复制给类中的每个对象,因此这一类中的所有对象的这个属性都相同。不过,可以在一个对象 中更改原型属性的值,新的值将覆盖默认值,但仅在该实例中有效。属于这个类的其他对象不受此更改的影响。    
  使用这个原则,可以给   JScript   语言内部的对象定义附加属性,所有这些对象都具有原型。例如,如果要在计算中使用一个特殊的常数,而在   Math   和   Number   对象中提供的常数没有包括该常数,则可以自己定义,并对其指定各自的对象原型,或对象类的原型属性。    
   
  Math.prototype.Avogadro   =   6.0232E23;  
  function   howManyMolecules(wtGrams,molWt)   {  
  return   ((wtGrams/molWt)*Math.prototype.Avogadro);  
  }  
  document.write("There   are   "   +   howManyMolecules(window.prompt("How   many   grams?",0),window.prompt  
  ("What's   the   molecular   weight?",0))   +  
    "   molecules   in   that   amount.");  
   

  也许还需要指出的一点是,您可以定义一个函数,将其指定为   String.prototype   的一个方法,并在脚本的任何地方随字符串使用该函数。下面的示例假定已有一个在脚本的其他地方定义的、称为   "theElements"   的   元素周期表(Periodic   Chart)数组,该数组中包含了元素的符号、名称、原子数以及其他相关信息。    
   
  function   atomName(theSymbol)   {  
  return(theElements[theSymbol].fullName);  
  }  
   
  String.prototype.atomName   =   atomName;  
   
  function   decodeFormula(theFormula)   {  
  var   theCurrentPiece   =   "";  
  var   theDecodedFormula   =   "";  
  for   (i   =   1;   i   =   theFormula.length   ;   i++);  
  if   (theFormtheCurrentPiece    
  //   将公式字符串分为符号和数字的数组。  
  //   循环该公式数组并装配拆开的字符串。每一项为:  
  theDecodedFormula   +=   formula[n].number  
  theDecodedFormula   +=   "   ";  
  theDecodedFormula   +=   formula[n].symbol.prototype.atomName;  
  theDecodedFormula   +=   "   "  
  //   循环结束。  
   
  return   theDecodedFormula;  
  }  
   
  decodeFormula(window.prompt("Formula?","Al2O3"));  

 

例子:

document.onclick   =   Function("alert(0);");  
  alert(document.onclick);  
   
  function   d()   {  
          alert(0);  
  }  
  document.onclick   =   d;  
  alert(document.onclick);  
   
  上述两个实现的功能其实是一样的,不过第一个用的就是anonymous函数,因为document.onclick并没有像第二个 document.onclick明确地指定为d()这个函数,所以称之为anonymous函数。另为从上面的alert()中也可以看到不同。  
   
  其实其他许多<...   onclick="alert(0);">也是anonymous函数。  

PDO多种方式取得查询结果

PDO最大的特点之一是它的灵活性,本节将介绍如何取得查询结果,包括:

数组(数值或关联数组);

字符串(单列的结果集);

对象;

回调函数。

1.快取一行

FetchColumn是为应用程序取得一个仅包含单列的数据,代码如下:

$u = $db->query(“SELECT id FROM users WHERE login=
‘login’ AND password=‘password’”);
fetch(PDO::FETCH_COLUMN)
if ($u->fetchColumn()) { //返回一个字符串
//登录成功
} else {
//验证失败
}
?>

2.取得一个标准对象

还可以将取得的一行作为一个标准类stdClass的对象实例,其中列名=属性名。

$res = $db->query(“SELECT * FROM foo”);
while ($obj = $res->fetch(PDO::FETCH_OBJ)) {
// $obj == instance of stdClass
}
?>

3.存取为一个类

PDO允许将结果保存为一个类,例子如下:

$res = $db->query(“SELECT * FROM foo”);
$res->setFetchMode(
PDO::FETCH_CLASS,
“className”,
array(‘optional’=‘Constructor Params’)
);
while ($obj = $res->fetch()) {
// $obj == instance of className
}
?>

4.从一个类取得常量

PDO允许查询的结果可以被用来生成一个目的类。

$res = $db->query(“SELECT * FROM foo”);
$res->setFetchMode(
PDO::FETCH_CLASS |
PDO::FETCH_CLASSTYPE
);
while ($obj = $res->fetch()) {
// $obj == instance of class who’s name is
// found in the value of the 1st column
}
?>

5.存取为一个对象

PDO还允许获取数据到一个已经存在的对象。

$u = new userObject;
$res = $db->query(“SELECT * FROM users”);
$res->setFetchMode(PDO::FETCH_INTO, $u);
while ($res->fetch()) {
// 取得的记录集将放在$u这个对象变量中,在此显示
}
?>

6.存取为关联数据

PDO实现了迭代器(Iteator)接口,允许一个方法实现迭代的功能。

$res = $db->query(
“SELECT * FROM users”,
PDO::FETCH_ASSOC
);
foreach ($res as $row) {
// $row是一个关联数组,可以直接显示,如$row['id']
}
?>

7.fetchAll()方法

PDO也提供了和ADODB类似的fetchAll()方法,它允许从一个结果集中取得数据,然后放于关联数组中。

$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
$qry = “SELECT * FROM users”;
$res = $db->query($qry)->fetchAll(PDO::FETCH_ASSOC);
?>
或者获取到索引数组里:
$res = $db->query("SELECT * FROM foo");
$result_arr = $res->fetchAll();
print_r($result_arr);
?>

数字索引数组比较浪费资源,请尽量使用关联数组,这样可以在内存中使用相当密集的大型结果集。

相关说明如下:

setAttribute()方法用于设置部分属性,主要属性有:PDO::ATTR_CASE、PDO::ATTR_ERRMODE等,这里需要设置的是PDO::ATTR_CASE,就是使用关联索引获取数据集时,关联索引是大写还是小写,有如下几个选择:

PDO::CASE_LOWER——强制列名是小写;

PDO::CASE_NATURAL——列名按照原始的方式;

PDO::CASE_UPPER——强制列名为大写。

我们使用setFetchMode方法来设置获取结果集的返回值的数据类型,类型有:

PDO::FETCH_ASSOC——关联数组形式;

PDO::FETCH_NUM——数字索引数组形式;

PDO::FETCH_BOTH——两种数组形式都有,这是默认的;

PDO::FETCH_OBJ——按照对象的形式,类似于以前的 mysql_fetch_object()。

当然,一般情况下,我们使用PDO::FETCH_ASSOC取得关联数组。具体使用哪种类型,应按照自己的实际应用选择。

8.fetchColumn()方法

如果想获取指定记录里的一个字段结果,则可以使用PDOStatement::fetchColumn()。

$rs = $db->query("SELECT COUNT(*) FROM foo");
$col = $rs->fetchColumn();
echo $col;
?>


一般使用fetchColumn()方法进行count统计,对某些只需要单字段的记录可以很好地操作。

9.回调函数

PDO还规定在每一个fetch模式下,经过处理后的结果中使用一个回调函数。

function draw_message($subject,$email) { … }
$res = $db->query(“SELECT * FROM msg”);
$res->fetchAll(PDO::FETCH_FUNC,“draw_message”);
?>

10.直接查询的问题

直接使用Query查询行每次都会直接提交给数据库,如果查询较多,每次频频查询将导致效率降低。
另外,在安全问题上,没有过滤一些特殊字符容易产生SQL注入。

11.过滤字符

下面我们来看看如何使用PDO进行过滤引起SQL注入的方法,即过滤特殊字符。我们在PDO中使用quote()方法,使用例子如下:

$query = “SELECT * FROM users WHERE
login=“.$db->quote($_POST[‘login’]).”
AND
passwd=“.$db->quote($_POST[‘pass’]);

12.事务处理

PDO驱动程序支持所有的事务数据库,并且PDO提供更简便的方法,如下:

$db->beginTransaction();
if ($db->exec($qry) === FALSE) {
$db->rollback();
}
$db->commit();
?>

13.执行一个批处理事务

在下面的示例中,假设我们为一个新雇员创建一组条目,这个雇员有一个ID号,即23。除了输入这个雇员的基本数据外,还需要记录雇员的薪水。分别完成两个更新很简单,但通过将这两个更新包括在beginTransaction()和commit()调用中,就可以保证在更改完成之前,其他人无法看到更改。如果发生了错误,catch块可以回滚事务开始以来发生的所有更改,并打印出一条错误消息。代码内容如下:

try {
$dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', 
array(PDO_ATTR_PERSISTENT => true));
echo "Connected\n";
$dbh->setAttribute(PDO_ATTR_ERRMODE, PDO_ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("insert into staff (id, first, last)
values (23, 'Joe', 'Bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate) 
values (23, 50000, NOW())");
$dbh->commit();

} catch (Exception $e) {
$dbh->rollBack();
echo "Failed: " . $e->getMessage();
}
?>


并不是一定要在事务中做出更新,也可以通过复杂的查询来提取数据,还可以使用信息构建更多的更新和查询。当事务在活动时,可以保证其他人在工作进行当中无法做出更改。事实上,这不是100%的正确,但如果您之前没有听说过事务的话,这样介绍也未尝不可。
下面是一个扩展PDO&PDO语句的类,内容如下:

class Database extends PDO{
function __construct()   {
parent::__construct('mysql:dbname=test;host=
localhost', 'root', '');
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS,
array('DBStatement'array($this)));
}
}

class DBStatement extends PDOStatement{
public $dbh;
protected function __construct($dbh)   {
$this->dbh = $dbh;
$this->setFetchMode(PDO::FETCH_OBJ);
}
public function foundRows()   {
$rows = $this->dbh->prepare('SELECT found_rows()
AS rows',array(PDO::MYSQL_ATTR_ USE_BUFFERED_QUERY =
> TRUE));
$rows->execute();
$rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows;
$rows->closeCursor();
return $rowsCount;
}
}
?>

14.存储过程

在MySQL一章,我们已经了解了存储过程的创建,下面我们来看使用PDO调用的例子:

$stmt = $dbh->prepare("CALL sp_set_string(?)");
$stmt->bindParam(1, $str);
$str = ‘hospinfo’; //绑定参数
$stmt->execute();
?>

与先前讲过的绑定例子差不多,只是这里使用了“?”数据绑定方法,sp_set_string是存储过程名称。
带有输出参数的存储过程:

$stmt = $dbh->prepare("CALL sp_get_string(?)");
$stmt->bindParam(1, $ret,PDO:ARAM_STR, 4000);
if ($stmt->execute()) {
echo "返回值 $ret\n";
}

下面是绑定列输出的脚本例子:

$stmt = $dbh->prepare("SELECT extension, name from CREDITS");
if ($stmt->execute()) {
$stmt->bindColumn('extension', $extension);
$stmt->bindColumn('name', $name);
while ($stmt->fetch(PDO::FETCH_BOUND)) {
echo "Extension: $extension\n";
echo "Author: $name\n";
}
}
?>

标签: 数组, query, PDO, res