数组操作
array_walk() 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。
array_walk_recursive() 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。该函数与 array_walk() 函数的不同在于可以操作更深的数组(一个数组中包含另一个数组)。
instanceof用于确定一个 PHP 变量是否属于某一类class的实例
instanceof也可用于确定一个变量是不是实现了某个接口的对象的实例
array_shift()删除数组头部元素,并返回,数组为空或不存在返回null
new StringValidator($this->shell->_unsafeVar[$key] ?? null, $this->shell)
str_pad() 函数把字符串填充为新的长度。
# urlencode处理成“+”,rawurlencode处理成“%20”
urlencode:返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。
rawurlencode:返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 RFC 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。
$a1=str_replace(array('b','a'),'c','abc');
str_replace(array('b','a'),array('c','d'),'abc');
array_search('v',array('ad','cd','c'=>'v'));//返回c或者false
array_key_exists('c',array('ad','cd','c'=>'v'));//返回bool
$d = array('a'=> 'c','cd' =>'ls');
list($k,$v) =each($d);
var_dump($k);//a
var_dump($v);//c
$d = array('a'=> 'c','cd' =>'ls');
$ds = array_slice($d,0,2);
var_dump($ds);//array('a'=>'c','cd'=>'ls')
$d = array('a'=> 'c','cd' =>'ls');
$ds = array_splice($d,0,1);
//可以将数组中的一段取出,与上个函数不同在于返回的序列从原数组中删除
var_dump($ds);//array('a'=> 'c')
var_dump($d);//array('cd'=> 'ls')
`
$d = array('a'=> 'c','cd' =>'ls','cc'=>'ds','mm'=> 'ss');
$ds = array_chunk($d,2,true);
var_dump($ds);
array(2) {
[0]=>
array(2) {
["a"]=>
string(1) "c"
["cd"]=>
string(2) "ls"
}
[1]=>
array(2) {
["cc"]=>
string(2) "ds"
["mm"]=>
string(2) "ss"
}
}
$d=array('a'=> 'c','cd' =>'ls','cc'=>'ds','mm'=> 'ss');
$ds = array_pad($d,6,'u');
var_dump($ds);
array(6) {
["a"]=>
string(1) "c"
["cd"]=>
string(2) "ls"
["cc"]=>
string(2) "ds"
["mm"]=>
string(2) "ss"
[0]=>
string(1) "u"
[1]=>
string(1) "u"
}
`
数组与栈
array_push($arr,”apple”,”pear”);将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数
array_pop($arr);将数组栈的最后一个元素弹出(出栈)
数组与队列
array_shift($arr);数组中的第一个元素移出并作为结果返回(数组长度减1,其他元素向前移动一位,数字键名改为从零计数,文字键名不变)
array_unshift($arr,”a”,array(1,2));在数组的开头插入一个或多个元素
回调函数
array_filter($arr,”function”);使用回调函数过滤数组中的每个元素,如果回调函数为TRUE,数组的当前元素会被包含在返回的结果数组中,数组的键名保留不变
`
$d=array('a'=> 'c','v'=>'t');
array_walk($d,'test',3);
functiontest(&$item,$v,$a){
$item=$item.$a;
}
var_dump($d);
array(2) {
["a"]=>
string(2) "c3"
["v"]=>
string(2) "t3"
}
`
$d=array(1,2,3,4);
$ds = array_map('test',$d);
functiontest($n){
return($n*$n);
}
var_dump($ds);
array(4) {
[0]=>
int(1)
[1]=>
int(4)
[2]=>
int(9)
[3]=>
int(16)
}
functionmap_Spanish($n, $m)
{
return(array($n => $m));
}
$a=array(1, 2, 3, 4, 5);
$b=array("uno", "dos", "tres", "cuatro", "cinco");
$c = array_map("map_Spanish", $a, $b);
array(array(1=>"uno"),array(2=>"dos"),...);
array_reduce — 用回调函数迭代地将数组简化为单一的值
functionsum($carry, $item)
{
$carry += $item;
return$carry;
}
functionproduct($carry, $item)
{
$carry *= $item;
return$carry;
}
$a=array(1, 2, 3, 4, 5);
var_dump(array_reduce($a, "sum")); // int(15)
var_dump(array_reduce($a, "product", 10)); // int(1200), because: 10*1*2*3*4*5
array_sum($arr);对数组内部的所有元素做求和运算
array_protuct($arr);计算数组中所有值的乘积
29:数组的合并
array_merge($arr1,$arr2);合并两个或多个数组(相同的字符串键名,后面的覆盖前面的,相同的数字键名,后面的不会做覆盖操作,而是附加到后面,下标重置)
“+”$arr1+$arr2;对于相同的键名只保留后一个
array_merge_recursive($arr1,$arr2);递归合并操作,如果数组中有相同的字符串键名,这些值将被合并到一个数组中去。 如果一个值本身是一个数组,将按照相应的键名把它合并为另一个数组。当数组具有相同的数组键名时,后一个值将不会覆盖原来的值,而是附加到后面
30:数组的差集
array_diff($arr1,$arr2);返回差集结果数组
array_diff_assoc($arr1,$arr2,$arr3);返回差集结果数组,键名也做比较
31:数组的交集
array_intersect($arr1,$arr2);返回交集结果数组
array_intersect_assoc($arr1,$arr2);返回交集结果数组,键名也做比较
range(0,12);创建一个包含指定范围单元的数组
array_unique($arr);移除数组中重复的值,新的数组中会保留原始的键名
array_reverse($arr,TRUE);返回一个单元顺序与原数组相反的数组,如果第二个参数为TRUE保留原来的键名
//srand((float)microtime()*10000000); 随机种子触发器
array_rand($arr,2);从数组中随机取出一个或 多个元素
shuffle($arr);将数组的顺序打乱
functionget($classname)
{
$a=__NAMESPACE__.'\\' . $classname;//重要应用:动态创建名称
returnnew$a;
}
$message = 'hello';
// 没有 "use"
$example=function() {
var_dump($message);
};
echo$example();//NULL
// 继承 $message
$example=function()use ($message) {
var_dump($message);
};//hello
用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
classCallableClass
{
function__invoke($x) {
var_dump($x);
}
}
$obj=newCallableClass;
$obj(5);
?>//int(5)
如果两个trait都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个trait在同一个类中的命名冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as操作符可以将其中一个冲突的方法以另一个名称来引入。
traitA {
publicfunctionsmallTalk() {
echo'a';
}
publicfunctionbigTalk() {
echo'A';
}
}
traitB {
publicfunctionsmallTalk() {
echo'b';
}
publicfunctionbigTalk() {
echo'B';
}
}
classAliased_Talker {
useA, B {
B::smallTalk insteadof A;
A::bigTalkinsteadofB;
B::bigTalkastalk;
}
}
Talker 使用了traitA 和 B。由于 A 和 B 有冲突的方法,其定义了使用traitB 中的 smallTalk 以及traitA 中的 bigTalk。
Aliased_Talker 使用了as操作符来定义了 talk 来作为 B 的 bigTalk 的别名。
(newfruit)->apple();//输出apple
$array = [
[1, 2],
[3, 4],
];
foreach($arrayaslist($a, $b)) {
echo"A: $a; B: $b\n";
}
?>
使用 ... 运算符定义变长参数函数
functionf($req, $opt = null, ...$params) {
// $params 是一个包含了剩余参数的数组
printf('$req: %d; $opt: %d; number of params: %d'."\n",
$req, $opt, count($params));
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>
在调用函数的时候,使用 ... 运算符, 将 数组 和 可遍历 对象展开为函数参数。
functionadd($a, $b, $c) {
return$a + $b + $c;
}
$operators = [2, 3];
echoadd(1, ...$operators);
?>
注:使用...运算符的参数,只能放在函数的参数列表中的最后一位。它的后面不能再有参数。
加入右连接运算符 ** 来进行幂运算。 同时还支持简写的 **= 运算符,表示进行幂运算并赋值。
现在支持通过newclass来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。
php
class SomeClass {}
interfaceSomeInterface {}
traitSomeTrait {}
var_dump(newclass(10)extendsSomeClassimplementsSomeInterface {
private$num;
publicfunction__construct($num)
{
$this->num = $num;
}
useSomeTrait;
});
从同一namespace导入的类、函数和常量现在可以通过单个use 语句 一次性导入了。
use some\namespace\ClassA;
usesome\namespace\ClassB;
usesome\namespace\ClassC as C;
usefunction some\namespace\fn_a;
usefunction some\namespace\fn_b;
usefunction some\namespace\fn_c;
useconst some\namespace\ConstA;
useconst some\namespace\ConstB;
useconst some\namespace\ConstC;
// PHP 7+ code
usesome\namespace\{ClassA, ClassB, ClassC as C};
usefunction some\namespace\{fn_a, fn_b, fn_c};
useconst some\namespace\{ConstA, ConstB, ConstC};
?>
PHP 7 增加了新的伪随机字节生成器(CSPRNG)
$rndByte = random_bytes(6); // 6 是长度
var_dump(bin2hex($rndByte));// "be2a4c1c3da4"
$rndInt = random_int(2,10);
var_dump($rndInt);//int(9)
PHP 7 新增加了 intdiv() 函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整
echointdiv(13, 3); //4
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");
//比较多个数组的键值,返回交集
$result=array_intersect($a1,$a2);
print_r($result);
Array( [a] => red [b] => green [c] => blue )