【输入输出】26周[0624-0630]

输入

阅读《代码精进之路》累计进度50%。学到些整洁代码的思想并用到了项目中了。

输出

数组简单题:旋转数组、存在重复、只出现一次的数字、两个数组的交集II、加一

一周三道算法题,难度不限。

收获

代码

  1. ?:写法

我看到代码中很多这样的写法。挺好的,我之前写都是$arr['c'] ? $arr['c'] : 12

$arr = ['d'=>3];
$a = $arr['c'] ?: 12; // 这种写法的含义是,如果有$arr['c'] ,就是$arr['c'] 的值,否则是12。但问题是,你必须给$arr['c']做isset判断。否则报notice,`c` index不存在。

所以,不如改成$a = $arr['c'] ?? 12

  1. array_merge(..., array)

使用场景,示例代码:

$topicList = [
    ["topic_id"=>"1", "topic_name"=>"话题名称1", "product_ids"=>[12, 13]],
    ["topic_id"=>"2", "topic_name"=>"话题名称2", "product_ids"=>[14, 15]],
    ["topic_id"=>"3", "topic_name"=>"话题名称3", "product_ids"=>[16, 17]],
];
$productIds = [];
foreach($topicList as $t) {
    $productIds = array_merge($productIds, $t['product_ids']);
}
var_dump($productIds);

$productIds = [];
foreach($topicList as $t) {
    $productIds[] = $t['product_ids'];
}
$productIds = array_merge(...$productIds);
var_dump($productIds);

3.利用内存(swoole中)。类静态属性保存数据。理论上多个worker会有多份。但是提供读没啥事。

$aList = Service::getList($where);
$redis      = Redis::getInstance('xxx');
$key        = RedisKey::a_LIST;
if (empty($aList)) {
    if (self::$aList) {
        $aList = self::$aList;
    } else {
        $ret                = $redis->get($key);
        $aList         = json_decode($ret, true);
        self::$aList = $aList;
    }
} else {
    $res = $redis->exists($key);
    if (!$res) {
        $redis->set($key, json_encode($aList));
    }
}
  1. 琐碎

swoole_table 实现原理剖析

Shm共享内存的函数

自己框架用swoole table 实现锁

gzdeflate 压缩函数 解压 函数gzinflate gzcompress, gzencode, gzdeflate三个压缩函数的对比

PHP的压缩函数实现:gzencodegzdeflategzcompress的区别https://www.jb51.net/article/78791.htm

php序列化 json、msgpack、igbinary

代码整洁

用sonarLint 去看自己的代码。效果还是有点意思的。sonarLint 有Cognitive Complexity的检查提示。你看到之后尽量把代码复杂度改小些。如果确实没得改那就算了。

示例一:

foreach 嵌套了。

$aIds = [];
foreach ($cs as &$c) {
    if (isset($c['a_list']) && !empty($c['a_list'])) {

        foreach ($c['a_list'] as $val) {
            if (isset($val['a_id'])) {
                $aIds[] = $val['a_id'];
            }
        }
    }

    if (isset($c['b_list']) && !empty($c['b_list'])) {
        foreach ($c['b_list'] as $val) {
            if (isset($val['a_info']['a_id'])) {
                $aIds[] = $val['a_info'][a_id'];
            }
        }
    }
}

我想也许可以改成如下。

$aIds = [];
$aList = array_column($cs, null, 'a_list');
$bList = array_column($cs, null, 'b_list');

foreach ($aList as $val) {
   if (isset($val['a_id'])) {
       $aIds[] = $val['a_id'];
   }
}

foreach ($bList as $val) {
   if (isset($val['a_info']['a_id'])) {
       $aIds[] = $val['a_info']['a_id'];
   }
}

示例二:

两个if可以合并

if (version_compare(版本号, '2.8.3', '>=')) {
    if (in_array(self::xxx, [xxx,xxxxx])) {
        return true;
    }
}

可以合并成如下。

if (version_compare(版本号, '2.8.3', '>=') && in_array(self::, [xxx, xxxx])) {
    return true;
}
return false;

示例三:是否可以精简下

$a       = is_null(array_keys($bList)) ? [] : array_keys($bList);

改成如下,即使$bList 为null。类型转换会把null转换成具体类型。比如array 转成 [] ,string 转成"",int转成0,float也是0,object那就是对象了。

$a  = array_keys((array)$bList);

示例四:还是合并if

if (in_array(self::$a, [xxx, yyy])) {
    if ("d" == self::$b || "dd" == self::$b) {
        self::$b = "";
    }
}
if (in_array(self::$a, [xxx, yyy]) && in_array(self::$bm, ['d', 'dd'])) {
    self::$b = "";
}

工具

1.git 忽略空格

比如,你在两个变量之间加了一个空格。diff的时候,看到行数变化了。并不影响功能。-w可以忽略空格。

git diff -w 可以忽略空格
tig -w 

2.命令行快捷键

命令行快捷键 ctrl+u 清除一行等(之前一直用ctrl+a、ctrl+w、ctrl+e、ctrl+b 等,但有的没记过,我想这些快捷键,慢慢用即可吧)

https://www.jianshu.com/p/68e1c92564dc

3.json diff

Jsondiff 工具 https://github.com/xlwings/jsondiff

jsondiff 网站 https://www.sojson.com/jsondiff.html

4.SonrLint常见解决方案

https://blog.csdn.net/qq_37107280/article/details/86677098

5.PostmanPre-request Script 使用详解

https://blog.csdn.net/testdeveloper/article/details/80712273

适用场景:之前做登录。我需要先调授权,然后拿到token。然后手动调另一个接口。pre-request script。可以实现,调用一次。把获取token的那步。放到pre-request中。把调用到的token。设置成变量。在body框{{token}}。这样就好些了。

想法与实践

简单直观:使用小的代码块。 (《代码精进之路》之《20 | 简单和直观,是永恒的解决方案》)。

以下代码是实践(代码做了处理)。两个指标的统计数据处理都用一个dealStatList ,是因为两个指标的统计字段后来用了一个字段名这样就公用一个函数即可。

class StatService
{
    const PERCENT_INDEX = 0.75;
    const PV_LIMIT_COUNT = 1000;

    /**
     * @param array $ids
     * @return array
     */
    public static function getCtrList(array $ids) : array {.....}

    /**
     * @param int $startTime
     * @param array $ids
     * @return array
     */
    public static function getGmvWithPvRatioList(int $startTime, array $ids) : array {...}

    /**
     * @param array $ids
     * @return array
     */
    public static function getDealCtrList(array $ids) : array {...}

    /**
     * @param int $startTime
     * @param array $ids
     * @return array
     */
    public static function getDealGmvWithPvRatioList(int $startTime, array $ids) : array {...}

    /**
     * @param array $statInfo
     * @param float $defaultValue
     * @return array
     */
    public static function dealStatList(array $statInfo, float $defaultValue) : array {...}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容