PHP代码优化与总结

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 )  

你可能感兴趣的:(php)