PHP语法调优与坑
author:hoewang
文章目录
- PHP语法调优与坑
- isset千百倍优于in_array
- 熟练使用continue与break
- while里面断点问题
- 循环处理foreach使用&引用
- in_array的自作聪明模式
- 关于array_column强大用法
- array_merge的坑
- 短路代码灵活使用
- list直接取方法返回数组的变量
- 关于检测字符串存在
- array_unique问题
- array_diff的理解
- array_count_values 统计值的个数
- array_chunk()的分批处理
- function() use ()
- ?? 以及 ?:
- switch和elseif
- array_filter清除空值减少循环次数
isset千百倍优于in_array
在一个循环500次以上(瓶颈)中:
isset的速度是in_array的百倍以上
in_array('a', ['a', 'b'])
替换为:
$a = ['a' => 1, 'b' => 1]
isset($a['a']);
熟练使用continue与break
continue 2//继续双重循环,数字可以自己传
break 2//打断双重循环,数字可以自己传
while里面断点问题
在whie循环当中禁止打断点,而没有break;
这个while未被打断你的线程不会终止
循环处理foreach使用&引用
没这个习惯而引发的BUG已经发现了不少
foreach ($arr as &$data){}
unset($data);
in_array的自作聪明模式
in_array('a', [0]) //TRUE
in_array('1a', [0]) //FALSE
第三个参数
TRUE
为开启强数据对比(数据类型和值一起比)
默认为False(自作聪明):
循环第二个参数(即数组),
根据每个元素的类型去强行转换in_array的第一个参数然后进行对比
例子1:(int)'a' = 0,所以是true
例子2:(int)'1a' = 1,所以是false
关于array_column强大用法
example
$a = [
[
'id' => 1,
'name' => '小王'
],
[
'id' => 2,
'name' => '小刘'
]
]
array_column($a, 'id') = [1, 2];
array_column($a, 'name', 'id') = [1=>'小王', 2=>'小刘'];
array_column($a, NULL, 'name') = [
'小王' => [
'id' => 1,
'name' => '小王'
],
'小刘' => [
'id' => 2,
'name' => '小刘'
]
];
array_merge的坑
array_merge([1,2,3], [4,5,6], NULL , [7,8,9]) = NULL
短路代码灵活使用
$res && $change = 1;
当$res正确的时候才会继续后面的变量赋值
list直接取方法返回数组的变量
example
function getAll() {
$count = 1;
$list = [1,2,3,4];
return [$count, $list];
}
list($count,$list) = getAll()
var_dump($count);
var_dump($list);
关于检测字符串存在
统一使用:原因不想解释
if (strpos('www.idc-gz.com','www.') !== false)
array_unique问题
1.多维数组去重(确保重复维度结构一致)
array_unique($arr,SORT_REGULAR);
2.注意array_unique使用后会保留key
常规用法:
array_values(array_unique())
array_diff的理解
//获取的并不是差集,而是$a独有的元素集
array_diff($a, $b);
array_count_values 统计值的个数
example
array_count_values统计所有值的个数
$a=array("A","Cat","Dog","A","Dog");
array_count_values($a)["A"] == 1;
array_chunk()的分批处理
example
$a = [
[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]
];
$b = array_chunk($a,6) ==
[
0=> [
[],[],[],[],[],[] //6个
],
1=> [
[],[],[],[],[],[] //6个
]
]
foreach($b as $data)进行分批处理
function() use ()
example
$qizhiUpstream = 22.2;
//下面的闭包函数通过use使用到了$qizhiUpstream
$a = function (FortnessSvr $fortnessSvr) use ($qizhiUpstream) {};
$res = $a($fortnessSvr);
?? 以及 ?:
example
$headerVal = 0;
$this->params = $headerVal ?? 2; 相当于 isset($headerVal) ? $headerVal : 2; //结果是0
$this->params = $headerVal ?: 2; 相当于 !empty($headerVal) ? $headerVal : 2; //结果是2
switch和elseif
example
//如果switch不写break会不停的走进case的区间,根据自己的业务需求来选择是不是要使用break
switch (expr)
{
case expr1:
statement;
break;
case expr2:
statement;
break;
……
default:
statement;
}
//if下的elseif每个都会走一遍
$a = $c = 2;
if ($a == 2) {
$b = 3;
} elseif ($c == 2) {
$b = 4;
}
//b == 4
array_filter清除空值减少循环次数
example
//使用array_filter()
$arr = [0, 1, 2, false, '', null, "0"];
$arr = array_filter($arr);
print_r($arr); // Array ( [1] => 1 [2] => 2 )