1. array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] ) : array

array_slice()这个从数组中取出一段的函数,需要传递一些整型数字来指明使用者需要目标数组中的哪一个段。

当第二参数 $offset ,和第三参数 $length 长度都是整型正整数的时候,用环形角度理解数组索引还是线段角度理解数组的索引,事实上没什么太大区别。

但当这两个参数中有一个是整型负整数时,用环形角度来理解数组索引更为统一。

人类理解抽象事物总是设法与其脑海中建立的形象模型关联,于是我们首先得有下面图中的这两种概念,图中的数字代表了数组的索引。

第一幅图是环形,起点为0,顺时针为正方向,逆时针为负方向

第二幅图是线段形,起点为0,朝右为正方向,朝左为负方向

然后再考虑这两种形象模型在具体的例子中的表现。

第一种情况:

  1. $arr_long = [1, 2, 3, 4, 2, 6, 2, 8];//没有贴上打印输出,自然不是忘了
  2. var_dump(array_slice($arr_long, 2, 3));

环形和线段形都可以这样描述:从偏移量为2的地方,向正方向截取3个长度,然后返回这一段所组成的数组。

第二种情况:

  1. $arr_long = [1, 2, 3, 4, 2, 6, 2, 8];//没有贴上打印输出,自然不是忘了
  2. var_dump(array_slice($arr_long, -2, 3));//这种情况下返回的数组只有两个元素

环形描述:从偏移量为-2的地方,向正方向截取3个长度,然后返回这一段所组成的数组。(偏移量-2,只是为了理解而统一化的说法,具体有没有类似的编程概念,该问谁呢?)

线段形描述:从倒数第二个元素,向正方向截取3个长度,然后返回这一段所组成的数组。

第三种情况:

  1. $arr_long = [1, 2, 3, 4, 2, 6, 2, 8];//没有贴上打印输出,自然不是忘了
  2. var_dump(array_slice($arr_long, 2, -3));

环形描述:从偏移量为2的地方,向着正方向一直截到偏移量为-3的地方(不包括偏移量为-3的元素),然后返回这一段所组成的数组。(偏移量-3,这样的说法目的同上。)

线段形描述:从偏移量为2的地方,向着正方向一直截到倒数第三个元素的地方(不包括倒数第三个元素),然后返回这一段所组成的数组。

推论

从环形的角度来理解数组,更为的方便快捷,因为环形描述的套路是一致的。

备注:

虽然还有类似这样的情况:

  1. $arr_long = [1, 2, 3, 4, 2, 6, 2, 8];
  2. var_dump(array_slice($arr_long, -2, -3));

输出为:

  1. [Running] php "d:\workspace\test.php"
  2. D:\workspace\test.php:3:
  3. array(0) {
  4. }
  5.  
  6. [Done] exited with code=0 in 0.512 seconds

有哪个家伙会自找麻烦,用这种方法搞来搞去?

以环形角度理解php数组索引的更多相关文章

  1. 转:如何学习SQL(第二部分:从关系角度理解SQL)

    转自:http://blog.163.com/mig3719@126/blog/static/285720652010950825538/ 6. 从关系角度理解SQL 6.1. 关系和表 众所周知,我 ...

  2. 深入理解Js数组

    深入理解Js数组 在Js中数组存在两种形式,一种是与C/C++等相同的在连续内存中存放数据的快数组,另一种是HashTable结构的慢数组,是一种典型的字典形式. 描述 在本文中所有的测试都是基于V8 ...

  3. Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

    一:数组的属性 每个数组都有它的属性,可分为:ndim(数组的维度),shape(数组每个维度的大小),size(数组的总大小),dtype(数组数据的类型) 二:数组索引 和python列表一样,N ...

  4. 从源码角度理解Java设计模式——装饰者模式

    一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...

  5. IL角度理解C#中字段,属性与方法的区别

    IL角度理解C#中字段,属性与方法的区别 1.字段,属性与方法的区别 字段的本质是变量,直接在类或者结构体中声明.类或者结构体中会有实例字段,静态字段等(静态字段可实现内存共享功能,比如数学上的pi就 ...

  6. IL角度理解for 与foreach的区别——迭代器模式

    IL角度理解for 与foreach的区别--迭代器模式 目录 IL角度理解for 与foreach的区别--迭代器模式 1 最常用的设计模式 1.1 背景 1.2 摘要 2 遍历元素 3 删除元素 ...

  7. 从tcp原理角度理解Broken pipe和Connection reset by peer的区别

    从tcp原理角度理解Broken pipe和Connection reset by peer的区别 http://lovestblog.cn/blog/2014/05/20/tcp-broken-pi ...

  8. Numpy数组索引为-1和None

    numpy的数组操作方便,可以用:来切片,用布尔数组或者布尔表达式来查找符合条件的数据,也可以用数组作为另一个数组的索引来查找指定的数据.但有时也会见到数组索引为-1和None.两者的用法如下: 1. ...

  9. numpy 数组索引数组

    在numpy中,数组除了可以被整数索引,还可以被数组索引. a[b]就是已数组b的元素为索引,读取数组a的值. 当被索引数组a是一维数组,b是一维或则多维数组时,结果维度维度与索引数组b相同. a = ...

随机推荐

  1. 利用Wireshark抓取并分析OpenFlow协议报文

    OpenFlow 交换机与控制器交互步骤 1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网 ...

  2. 美团Android自动化之旅—适配渠道包

    http://tech.meituan.com/mt-apk-adaptation.html 概述 前一篇文章(美团Android自动化之旅-生成渠道包)介绍了Android中几种生成渠道包的方式,基 ...

  3. JWT Claims

    JWT Claims “iss” (issuer)  发行人 “sub” (subject)  主题 “aud” (audience) 接收方 用户 “exp” (expiration time) 到 ...

  4. 【Java/Json】Java对Json进行建模,分词,递归向下解析构建Json对象树

    伸手党的福音 代码下载:https://files.cnblogs.com/files/xiandedanteng/JsonLexerBuilder20191202.rar 互联网上成型的对Json进 ...

  5. 实现一个自己的IOC

    实现一个自己的IOC package com.IocExample; import java.lang.reflect.Constructor; import java.lang.reflect.In ...

  6. IntelliJ IDEA悬停鼠标显示方法详细信息

    1.如果View -> Toolbar勾选情况下, 直接点击按钮打开设置, 或是直接点击File -> Settings(或是快捷键)打开设置窗口. 2.搜索栏中输入Show quick ...

  7. springboot+jwt完成登录认证

    本demo用于测试jwt,通过登录验证通过后,使用jwt生成token,然后在请求header中携带token完成访问用户列表信息. 准备工作: 1. 实体类SysUser.java package ...

  8. Python脚本实现Linux/MAC中Xmind Zen去水印等其他功能的过程(V0.1)

    说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明.功能简介 去除软件右上角激活按钮 去除导出时激活弹窗 去除导出PDF文 ...

  9. shell编程系列16--文本处理三剑客之awk模式匹配的两种方法

    shell编程系列16--文本处理三剑客之awk模式匹配的两种方法 awk的工作模式 第一种模式匹配:RegExp 第二种模式匹配:关系运算匹配 用法格式对照表 语法格式 含义 RegExp 按正则表 ...

  10. Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码

    Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 ...