PHP代码优化与总结

PHP语法调优与坑

author:hoewang

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 )  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值