PHP

数组操作

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 )

你可能感兴趣的:(PHP)