如何避免数组下标越界

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

抛出问题


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


回答问题


肯定是有的


举个栗子


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


我怎么保证 $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;
    }


解题思路


  1. 在方法外判断是否设置值
  2. 在方法外保证已经设置值,确保 $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;
    }


相关文章
|
3月前
|
人工智能 JavaScript 编译器
AI工具的“超级外挂”:从零手把手教你搭建私人 MCP 服务器
本文手把手教你用Node.js从零搭建私人MCP(模型上下文协议)服务器,解决AI无法直接访问本地文件、数据库等痛点。含环境配置、TypeScript编译避坑、Hello World工具开发及Inspector调试全流程,助你赋予AI真实行动力!
1097 1
AI工具的“超级外挂”:从零手把手教你搭建私人 MCP 服务器
Centos 内核更新后缺少initramfs 导致无法启动
Centos 内核更新后缺少initramfs 导致无法启动
|
7月前
|
人工智能 供应链 物联网
行业最新发布:2025保理公司排名揭晓,海尔金融保理如何成为市场焦点
《2025年保理公司综合实力排名》发布,海尔金融保理凭借强大股东背景、科技驱动的“海创云链”平台及“SaaS+IoT+AI”生态模式,位居榜首。其以数字化手段赋能产业链,实现融资高效化、风控智能化,服务超万亿资产生态,成为产融结合标杆。该排名综合资本实力、科技能力、产业布局等多维度评估,展现行业向科技化、生态化发展的趋势,为市场主体提供权威参考。
884 0
职场新人:怎么做结构化汇报?
文章介绍了结构化汇报的基本逻辑和四种常用逻辑框架,帮助读者提升职场技能。
1391 7
职场新人:怎么做结构化汇报?
|
安全 数据安全/隐私保护 Android开发
深入探索iOS系统安全机制:从基础到高级
本文旨在全面解析iOS操作系统的安全特性,从基础的权限管理到高级的加密技术,揭示苹果如何构建一个既开放又安全的移动平台。我们将通过实例和分析,探讨iOS系统如何保护用户数据免受恶意软件、网络攻击的威胁,并对比Android系统在安全性方面的差异。
|
人工智能 运维 数据可视化
玩转云服务器——阿里云操作系统控制台体验测评
在云服务器日益普及的背景下,运维人员对操作系统管理工具的要求不断提高。我们需要一款既能直观展示系统状态,又能智能诊断问题,提供专业指导的控制台。阿里云操作系统管理平台正是基于API、SDK、CLI等多种管理方式,致力于提升操作效率,为用户带来全新的系统运维体验。阿里云操作系统控制台凭借便捷易用的设计和高效的管理功能,成为云服务器运维的强力助手。本次测评基于真实体验截图,对其整体表现进行了深入探索。
530 33
|
SQL 测试技术 Python
SqlAlchemy 2.0 中文文档(四)(4)
SqlAlchemy 2.0 中文文档(四)
341 3
龙蜥社区落地开源生态发展合作倡议,构建开放兼容的操作系统生态
通过共同努力,三个社区基于服务器操作系统场景,在操作系统内核等关键共性技术链统一方面达成了一致。