• 一、场景
  • 二、规则
  • 三、动态给指定索引设置值
    • 1、方法一:尝试反转索引,从内向外设置数组的指定索引值(不行,改变了数据结构,其他索引不见,只剩指定的索引了)
      • 1)、物流平台1
        • (1)、代码
        • (2)、打印
        • (3)、分析
      • 2)、物流平台2
        • (1)、代码
        • (2)、打印
        • (3)、分析
      • 3)、总结
    • 2、方法二:尝试用把字符串设置为变量,再给变量赋值(不行,不生效)
      • 1)、我们以 [ 物流平台1 ] 的数据为例
      • 2)、打印
      • 3)、分析
    • 3、方法三:把需要设置的数组索引数组连接成字符串,用eval() 函数执行(可以)
      • 1)、我们以 [ 物流平台1 ] 的数据为例
      • 2)、打印
      • 3)、分析
      • 4)、[ 物流平台2 ] 代码及打印结果
  • 四、姊妹篇

一、场景

对接不同的第三方物流单号,极少数情况发货数量不对,需要手动修改数量;但是每个第三方物流接口返回的数据结构是不同的,我们需要自定义一套规则,用来获取到数组索引的值,然后前端修改,修改之后,给该索引的值赋值。

二、规则

  • [ 物流平台1 ] 的发货数量位于express,number,则需要修改 $data['express']['number'] 的值,rules 的值为 ['express', 'number']
  • [ 物流平台2 ] 的发货数量位于list,express,count,则需要修改 $data['list']['express']['count'] 的值,rules 的值为 ['list', 'express', 'count']
  • 以此类推…

注意:修改后的数据与修改前的数据结构是一致的(是根据索引给该索引重新赋值;而不是重置数据 只保留数据的索引值),只是发货的数量修改了

三、动态给指定索引设置值

1、方法一:尝试反转索引,从内向外设置数组的指定索引值(不行,改变了数据结构,其他索引不见,只剩指定的索引了)

1)、物流平台1

(1)、代码

public function expressOne() {$data = ['express' => ['no' => 'WLOne123', //物流编号'number' => 1 //发货数量],'other' => '其他信息'];$newValue = '新的值';$rules = ['express', 'number']; //需要设置的索引$rules = array_reverse($rules); //数组反转$ruleCount = count($rules);$info = [];foreach ($rules as $key => $index) {if ($info) {$tempInfo = $info;$info = []; //info重置$info[$index] = $tempInfo;} else {$info[$index] = $newValue;}//如果是最后一个,则给dara索引赋值if (($key+1) == $ruleCount) {$data[$index] = $info[$index];}}//        var_export($info);die;var_export($data);die;
}

(2)、打印

array ('express' => array ('number' => '新的值',),'other' => '其他信息',
)

(3)、分析

  • 很明显,express索引下的其他同级数据不见了

2)、物流平台2

(1)、代码

public function expressTwo() {$data = ['list' => ['express' => ['no' => 'WLTwo123', //物流编号'count' => 1 //发货数量],'other' => '其他信息'],'user' => '用户'];$newValue = '新的值';$rules = ['list', 'express', 'count']; //需要设置的索引$rules = array_reverse($rules); //数组反转$ruleCount = count($rules);$info = [];foreach ($rules as $key => $index) {if ($info) {$tempInfo = $info;$info = []; //info重置$info[$index] = $tempInfo;} else {$info[$index] = $newValue;}//如果是最后一个,则给dara索引赋值if (($key+1) == $ruleCount) {$data[$index] = $info[$index];}}//        var_export($info);die;var_export($data);die;
}

(2)、打印

array ('list' => array ('express' => array ('count' => '新的值',),),'user' => '用户',
)

(3)、分析

  • 很明显,list索引下的其他同级数据不见了

3)、总结

  • 很明显,这种方式直接把 $rules 第一个索引下 的 其他同级索引 都清空了,这属于重置操作,而不是修改操作

2、方法二:尝试用把字符串设置为变量,再给变量赋值(不行,不生效)

1)、我们以 [ 物流平台1 ] 的数据为例

public function expressOne() {$data = ['express' => ['no' => 'WLOne123', //物流编号'number' => 1 //发货数量],'other' => '其他信息'];$newValue = '新的值';$rules = ['express', 'number']; //需要设置的索引$variable = 'data';foreach ($rules as $key => $index) {$variable .= "['{$index}']";}//echo $variable; //打印:data['express']['number']$$variable = $newValue; //这句好像失效了var_export($data);die;
}

2)、打印

array ('express' => array ('no' => 'WLOne123','number' => 1,),'other' => '其他信息',
)

3)、分析

  • 把字符串转为变量,并赋值是可以的;但字符串是一个带有索引的数组data['express']['number'],好像不太行(待验证

3、方法三:把需要设置的数组索引数组连接成字符串,用eval() 函数执行(可以)

1)、我们以 [ 物流平台1 ] 的数据为例

public function expressOne() {$data = ['express' => ['no' => 'WLOne123', //物流编号'number' => 1 //发货数量],'other' => '其他信息'];$newValue = '新的值';$rules = ['express', 'number']; //需要设置的索引$variable = '$data';foreach ($rules as $key => $index) {$variable .= "['{$index}']";}$variable .= "='{$newValue}';";//        echo $variable;die; //打印:$data['express']['number']='新的值';eval($variable);var_export($data);die;
}

2)、打印

array ('express' => array ('no' => 'WLOne123','number' => '新的值',),'other' => '其他信息',
)

3)、分析

  • 1、把需要设置的数组索引数组连接成字符串,用 eval() 函数执行
  • 2、可能的问题:如果这个 $newValue 里 有单双引号 需要特殊处理
  • 3、eval 函数只支持字符串,如果 $newValue 的值是 数组,则方法三也满足不了~

4)、[ 物流平台2 ] 代码及打印结果

  • 代码
public function expressTwo() {$data = ['list' => ['express' => ['no' => 'WLTwo123', //物流编号'count' => 1 //发货数量],'other' => '其他信息'],'user' => '用户'];$newValue = '新的值';$rules = ['list', 'express', 'count']; //需要设置的索引$variable = '$data';foreach ($rules as $key => $index) {$variable .= "['{$index}']";}$variable .= "='{$newValue}';";//        echo $variable;die; //打印:$data['express']['number']='新的值';eval($variable);var_export($data);die;
}
  • 打印结果
array ('list' => array ('express' => array ('no' => 'WLTwo123','count' => '新的值',),'other' => '其他信息',),'user' => '用户',
)

四、姊妹篇

  • PHP 动态获取数组索引的值

PHP 动态设置数组索引的值相关推荐

  1. 微信小程序 setData动态设置数组中的数据

    现在有一组死数据 但是想在使用时动态修改其中的值 在setData中不能直接设置,真想......,算了是这个和谐的社会救了那个工程师. 接下来,我们去征服她! 死数据: //地图上方控件contro ...

  2. 动态设置html字号,动态设置html的font-size值 (适配文字大小)

    PC端 (function () { function setRootFontSize() { let rem, rootWidth; let rootHtml = document.document ...

  3. CWE-129: Improper Validation of Array Index(数组索引验证不当)

     ID: 129 类型:基础 结构:简单 状态:草稿 描述 产品在计算或使用数组索引时使用不受信任的输入,但产品不会验证或错误地验证索引,以确保索引引用数组中的有效位置. 关联视图 与"研究 ...

  4. 使用GDI+实现动态设置分级断点值

    在ArcMap的专题图制作中,我们对Classification并不陌生(如图).这主要是对应于ClassBreak类型的地图渲染而言的.它可以用来动态设置分类的等级数目,而且可以使用鼠标对代表Bre ...

  5. java bean传索引_Java如何设置bean的索引属性值?

    在此示例中,我们显示如何设置索引属性的值.在下面的代码中,我们修改了数组类型的值.我们要改变的第二颜色MyBean的colors属性. 我们以与使用该PropertyUtils.setSimplePr ...

  6. matlab循环遍历数组_Matlab - 访问for循环中最大值的索引,并使用它从数组中删除值...

    我想递归地找到一系列矩阵中的最大值(第8列,具体),然后使用该最大值的索引来设置数组中的所有值,索引最大为NaN的最大索引(对于列14:16) . 很容易找到最大值和索引,但是使用for循环为多个数组 ...

  7. 前端:JS/20/数组(数组的概念,数组元素,数组索引,数组元素的访问,数组的长度,数组的创建方法,数组的操作,实例:使用数组保存个人信息,实例:求数组所有值的平均值,数组对象的length属性)

    数组 1,数组的概念 一组值(或对象)的集合,称为"数组": var arr =[10,20,30,50]; var arr =["张三","男&qu ...

  8. 微信小程序修改数组中的元素_微信小程序——this.setData()动态修改数组中的某一值...

    微信小程序--this.setData()动态修改数组中的某一值S8v编程技术_踩坑日志_进阶指南_无知人生 大家是不是都觉得微信小程序的开发方式和 vue react 这种框架的开发方式很像?S8v ...

  9. vue修改meta值_vue中动态设置meta标签和title标签的方法

    vue中动态设置meta标签和title标签的方法 因为和原生的交互是需要h5这边来提供meta标签的来是来判断要不要显示分享按钮,所有就需要手动设置meta标签,标题和内容 //router内的设置 ...

  10. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

最新文章

  1. 数论分块 ---- 2020牛客多校第7场H-Dividing[思维+数论分块]
  2. 什么是类别不平衡?有哪些解决方案?
  3. 树莓派3上安装kali后的相关配置kali(2)
  4. Redux 莞式教程 之 简明篇
  5. json数据格式 python_python中json是什么文件格式
  6. ITK:生成具有正确面积的结构元素
  7. 零基础学习java------day11------常用API
  8. 10_Influxdb+Grafana监控Mysql
  9. BGP——AS—PATH正则表达式(实列讲解+配置)
  10. 小学三年级计算机室使用计划,小学计算机室工作计划
  11. GDC 2012]Epic Games谈在智能手机上制作和台式游戏机同等级的图形游戏的经验
  12. 令人失望的vb 的范型
  13. GridView 遍历每一行,两种写法
  14. iphone越狱-------平刷回越狱前(未越狱)状态
  15. CTFHub 备份文件下载
  16. el-amap的使用
  17. 主Module(app)直接跳转到子Module,子Module跳转到主Module(app)要借助Router
  18. python模拟登录淘宝直通车_Python实现的淘宝直通车数据抓取(2)
  19. 萝卜开会直播NO.2 | 换一个十年,感受不一样的世界
  20. 图片怎么批量压缩?这两个方法有掌握吗

热门文章

  1. 手动计算均值,方差,协方差,皮尔逊系数
  2. CodeforcesRound#498 (Div.3)E题Military Problem
  3. java 子串替换_Java中的多个同时子串替换
  4. java 图片旋转裁剪_【Java实例】使用Thumbnailator生成缩略图(缩放、旋转、裁剪、水印)...
  5. 朗逸发动机型号css和ea211的区别,css发动机是ea211吗
  6. 搜索引擎提交软件_网站如何被搜索引擎快速收录?
  7. python 算法库安装_Mahotas(Python 计算机视觉、图像处理库)安装
  8. 接口监控_从零开始入门 K8s | 可观测性:监控与日志
  9. python123基本统计值计算_基本统计值计算
  10. protobuf生成java类