后端代码规范避免数组下标越界

目录
  • 抛出问题
  • 回答问题
    • 举个栗子
    • 解题思路
  • 解题实践
    • 实践1:
    • 实践2:

抛出问题

数组下标越界真的是开发过程中的痛,除了在开发过程中各种判断是否设置,是否为空,还有其他优雅的办法解决吗?

回答问题

肯定是有的

举个栗子

比如,我有一个工具性质的方法如下:

我怎么保证 $batchUserCover[$userid]['pickedFootprint']$batchFootprintList[$userid]['list'] 不会有下标越界的问题呢?

    //批量获得图片故事 优先精选故事 不足三个拼接最近发布的故事
    public static function batchImageFootprint($userIds, $batchUserCover, $batchFootprintList)
    {
        $ret = [];
        foreach ($userIds as $userid) {
            $ret[$userid] = array_slice(array_merge($batchUserCover[$userid]['pickedFootprint'], array_slice($batchFootprintList[$userid]['list'], 0, 3)), 0, 3);
        }
        return $ret;
    }

解题思路

  • 在方法外判断是否设置值
  • 在方法外保证已经设置值,确保 $batchUserCover[$userid]['pickedFootprint'] 这类参数一定是存在的,已经设置了的.

我认为思路2更好

解题实践

实践1:

在传入数据之前,设置好传入值,保证传入值的key必须存在,值可以为null,或者空数组。 核心代码如下:

    public static function batchFormatCoverAndPickedFootprint($userListInfo)
    {
        foreach ($userListInfo as &$element) {
            $retData[$element['userid']] = [
                'pickedFootprint' => [],
                'coverFootprint' => [],
            ];
        }
        .
        .
        .
        return $retData;
    }

传入的数组的key必然符合[$userid]['pickedFootprint'],不会存在数组下标越界

    $batchUserCover = batchFormatCoverAndPickedFootprint(xxx);
    self::batchImageFootprint($userIds, $batchUserCover);

实践2:

和实践1的底层思路是一致的,区别在于实践1是在函数内首先定义了符合规范的初始值

实践2是先处理业务逻辑,在return之前定义了符合规范的初始值

(下面代码段写了注释,重点看后半部分;联合查询那部分代码质量也不错,没省略掉,看能不能抛转引玉。)

    public static function batchFootprintList($userIds, $pageCount = 21, $batchPickedFootprints = [], $select = 'userid,id,mid,image,text,ST_Astext(picgeom) as "picgeom",poi,poiid,city,province,country,pictime')
    {
        .
        .
        .
        //联合查询
        $union = self::query()->selectRaw($select)->where('userid', $userIds[0])
            ->where('status', self::TYPE_STATUS_NORMAL)
            ->whereNotIn('mid', $batchPickedFootprints[$userIds[0]])
            ->orderBy('id', 'desc')
            ->limit($pageCount);
        //避免重复查询第一条数据
        unset($userIds[0]);
        foreach ($userIds as $userId) {
            $unionItem = self::query()->selectRaw($select)->where('userid', $userId)
                ->where('status', self::TYPE_STATUS_NORMAL)
                ->whereNotIn('mid', $batchPickedFootprints[$userId])
                ->orderBy('id', 'desc')
                ->limit($pageCount);
            $union->unionAll($unionItem);
        }
        $allUserFootprints = $union->get()->toArray();
        $res = [];
        $chunkFootprintByUserid = self::_chunkFootprintByUserid($allUserFootprints);
        // 重点在这里
        foreach ($allUserIds as $userId) {
            $list = $chunkFootprintByUserid[$userId] ?? [];
            $count = count($list);
            //以此保证不会出现数据下标越界的问题
            $res[$userId]['list'] = $list;
            $res[$userId]['more'] = $count < $pageCount ? 0 : 1;
            $res[$userId]['track'] = $count > 0 ? (string)$list[$count - 1]['id'] : '';
        }
        return $res;
    }

注意

为了行文紧凑,代码段中省略了和文章无关的代码,用竖着的三个.省略。

以上就是后端代码规范避免数组下标越界的详细内容,更多关于数组下标越界的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python 切片索引越界的问题(数组下标越界)

    前言 Python语言处理字符串.数组类的问题时有一定概率需要使用切片方法,比如:Leetcode_5. 学习官方解法时发现切片的索引可以超出字符串或数组最大索引值,此时编译器不会报错. 欢迎大佬留言说明这种情况的具体原因,本文只进行一些情况的简单测试. 实例代码 a = '123' b = a[:5] print(b) 发现结果为123,编译器没有报错.而当直接使用a[5]时即报错string index out of range.下面是测试结果. 测试代码(字符串) a = "1234567

  • java数组中的异常类型整理

    对于程序中出现异常,是很多程序员不想看到的情况,因为这就需要我们去查询异常的原因,然后进行一些处理异常的操作.在Java数组操作时,也会有一些异常情况的发生.这里我们罗列出了两种:ClassCastException和NullPointerException,下面我们来看一下具体的介绍. 1.异常种类 检查型异常和非检查型异常的主要区别在于其处理方式.检查型异常都需要使用try,catch 和finally 关键字在编译器进行处理,否则会出现编译器报错.对于非检查型异常则不需要这样做.Java中

  • Java十分钟掌握数组与常见异常

    数组的定义 1:单个变量能存储信息 2:用来存储具有相同数据类型的数据集合,可以使用共同的名字来引用数组中存储的数据. 特点 数组可以存储任何类型的数据,包括原始数据类型和引用数据类型,但是一旦指定了数组的类型之后,就只能用来存储指定类型的数据. 数组的使用 声明一个数组变量来存放该数组 语法 数据类型 [] 数组名 数据类型 数组名[] //声明一个int类型 名为 numebr 的数组 int [] number; int number []; //以上两种方法都可以 创建一个新的数组对象并

  • js代码规范之Eslint安装与配置详解

    什么是 ESLint ESLint(中文站点)是一个开源的 JavaScript 代码检查工具,使用 Node.js 编写,由 Nicholas C. Zakas 于 2013 年 6 月创建.ESLint 的初衷是为了让程序员可以创建自己的检测规则,使其可以在编码的过程中发现问题而不是在执行的过程中.ESLint 的所有规则都被设计成可插入的,为了方便使用,ESLint 内置了一些规则,在这基础上也可以增加自定义规则. 一.Eslint安装 1.全局安装 如果你想使 ESLint 适用于你所有

  • jquery代码规范让代码越来越好看

    最近学了jQuery,感觉这个jQuery是真的挺不错的,果然像他说的那样,少些多做!刚一入手感觉真是不错.但是写多了,就会发现这个代码一行居然能写那么长.而且可读性还不好.  有幸自己买了一本锋利的jQuery这本书.我就整理了下.到底在实际应用中怎么让自己的jQurey的代码看起来可读性强,而且还有美感.  我就用了了本书中的一个小例子.来教教大家代码应该怎么写菜好看! 废话不多说,想把这个demo代码奉上.各位爷!您瞧好啊~ <!DOCTYPE html> <html lang=&

  • 后端代码规范避免数组下标越界

    目录 抛出问题 回答问题 举个栗子 解题思路 解题实践 实践1: 实践2: 抛出问题 数组下标越界真的是开发过程中的痛,除了在开发过程中各种判断是否设置,是否为空,还有其他优雅的办法解决吗? 回答问题 肯定是有的 举个栗子 比如,我有一个工具性质的方法如下: 我怎么保证 $batchUserCover[$userid]['pickedFootprint'] 和 $batchFootprintList[$userid]['list'] 不会有下标越界的问题呢? //批量获得图片故事 优先精选故事

  • 关于Google发布的JavaScript代码规范你要知道哪些

    Google为了那些还不熟悉代码规范的人发布了一个JS代码规范.其中列出了编写简洁易懂的代码所应该做的最佳实践. 代码规范并不是一种编写正确JavaScript代码的规则,而是为了保持源代码编写模式一致的一种选择.对于JavaScript语言尤其如此,因为它灵活并且约束较少,允许开发者使用许多不同的编码样式. Google和Airbnb各自占据着当前最流行的编码规范的半壁江山.如果你会在编写JS代码上投入很长时间的话,我强烈推荐你通读一遍这两家公司的编码规范. 接下来要写的是我个人认为在Goog

  • 总结PHP代码规范、流程规范、git规范

    代码规范.git规范.teambition规范.yii规范 1. 命名规范 (1).变量命名规范 1.变量使用驼峰命名法 禁止使用拼音或者拼音加数字 2.变量也应具有描述性,杜绝一切拼音.或拼音英文混杂的命名方式 3.变量包数字.字母和下划线字符,不允许使用其他字符,变量命名最好使用项目 中有据可查的英文缩写方式, 尽可以要使用一目了然容易理解的形式: 4.变量以字母开头,如果变量包多个单词,首字母小写,当包多个单词时,后面 的每个单词的首字母大写.例如 :$itSports 5.变量使用有效命

  • 微信小程序使用websocket通讯的demo,含前后端代码,亲测可用

    0.概述websocket (1) 个人总结:后台设置了websocket地址,服务器开启后等待有人去连接它. 一个客户端一打开就去连接websocket地址,同时传递某些识别参数.这样一来后台和客户端连接成功了,然后后台就可以发消息给客户端了,(客户端也可以再回话给后台). (2) socket叫套接字,应用程序用socket向网络发出请求或者应答网络请求. (3) 官方解释的socket 建立连接四步骤: 服务器端开启socket,然后accep方法处于监听状态,等待客户端的连接. 客户端开

  • vue-cli3项目配置eslint代码规范的完整步骤

    前言 最近接手了一个项目,由于之前为了快速开发,没有做代码检查.为了使得代码更加规范以及更易读,所以就要eslint上场了. 安装依赖 安装依赖有两种方法: 在cmd中打上把相应的依赖加到devDependencies下,再npm install对应依赖. 在package.json文件加上相应依赖: "eslint-plugin-html": "^6.0.3", "@vue/cli-plugin-eslint": "^3.3.0&qu

  • Java中16条的代码规范

    目录 一.MyBatis 不要为了多个查询条件而写 1 = 1 二. 迭代entrySet() 获取Map 的key 和value 三.使用Collection.isEmpty() 检测空 四.初始化集合时尽量指定其大小 五.使用StringBuilder 拼接字符串 六.若需频繁调用Collection.contains 方法则使用Set 七.使用静态代码块实现赋值静态成员变量 八.删除未使用的局部变量.方法参数.私有方法.字段和多余的括号. 九.工具类中屏蔽构造函数 十.删除多余的异常捕获并

  • 基于JavaScript实现大文件上传后端代码实例

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性.如MD5秒传的信息. 首先是文件数据接收逻辑,负责接收控件上传的文件块数据,然后写到服务器的文件中.控件已经提供了块的索引,大小,MD5和长度信息,我们可以根据需要来灵活进行处理,也可以将文件块的数据保存到分布式存储系统中. 文件初始化部分

  • java代码规范review异常事故记录

    目录 前言 一个任务处理例子 不要生吞异常 还有问题! End 前言 不久之前,部门进行了一次代码评审. 代码整体比较简单,该吹B的地方都已经吹过了,无非是些if else的老问题而已.当翻到一段定时任务的一步执行代码时,我的双眼一亮,觉得该BB两句了. 谁知这群家伙,评审的时候满满的认同感,但评审结束不久,就给我冠了个事B的称号. 今天我就把当时的这些话儿整理整理,让大家说道说道,我到底是不是个事B.淦! 一个任务处理例子 代码的结构大体是这样的. 通过定时,这段代码每天晚上凌晨都要对数据库的

  • 代码规范需要防微杜渐code review6个小错误纠正

    目录 code review 分析一下我的错误代码行为 1.写没必要的函数 2.Promise传递不明值 3.使用没必要try catch 4.Promise.all并发限制 5.Nodejs中使用过多sync函数 6.判空要放前面 code review 所谓code review,意思很明确,就是代码回顾,这个环节能帮你发现一些你代码中的不好的习惯,或者一些错误的行为.这个工作一般是团队的老大来做的,但是 我们的团队人均大佬 所以我们都是一起code review的,人多力量大,参加的人越多

随机推荐