【输入输出】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 等,但有的没记过,我想这些快捷键,慢慢用即可吧)

//www.greatytc.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 {...}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349