PHP 没有真正的数组!
<?php
$letters = ['d', 'c', 'a', 'b', 'e'];
$sorted = $letters;
natsort($sorted);
print $sorted[0];
答案是:它会输出d!
$ary = ['a', 'b', 'c'];
实际的操作其实是:
$ary = [0 => 'a', 1 => 'b', 2 => 'c'];
PHP会给每个元素指定一个整数键,从0开始依次排列,因此在许多方面这个数组的行为跟传统的数组很相似。
<?php
$ary = [1 => 'b', 2 => 'c', 0 => 'a'];
print $ary[0]; // 'a'
print $ary[1]; // 'b'
print $ary[2]; // 'c'
// Prints: b c a
foreach ($ary as $letter) {print $letter;
}
// Prints: 1:b 2:c 0:a
foreach ($ary as $key => $letter) {print "$key:$letter";
}
如果通过键来访问数组,那么其行为跟传统数组很相似。但在迭代数组时,它就不会关心键的顺序,而是按照数组元素定义的顺序:b,c,a。
<?php
$letters = ['d', 'c', 'a', 'b', 'e'];
$sorted = $letters;
natsort($sorted);
print_r($letters); // [0 => 'd', 1 => 'c', 2 => 'a', 3 => 'b', 4 => 'e']
print_r($sorted); // [2 => 'a', 3 => 'b', 1 => 'c', 0 => 'd', 4 => 'e']
print $sorted[0]; // 'd'
如果$sorted[0]不会访问数组中的第一个元素,那么怎样才能访问第一个元素呢?或者说,怎样才能访问前三个元素呢?方法有以下几种。
<?php
$sorted = [2 => 'a', 3 => 'b', 1 => 'c', 0 => 'd', 4 => 'e'];
$sorted = array_values($sorted);
print $sorted[0]; // 'a'
print $sorted[1]; // 'b'
print $sorted[2]; // 'c'
<?php
$sorted = [2 => 'a', 3 => 'b', 1 => 'c', 0 => 'd', 4 => 'e'];
$first_three = array_slice($sorted, 0, 3);
print $first_three[0]; // 'a'
print $first_three[1]; // 'b'
print $first_three[2]; // 'c'
这种做法的一个陷阱就是它依然会保留字符串键,这一点与array_values()不同。
<?php
$sorted = [2 => 'a', 3 => 'b', 1 => 'c', 0 => 'd', 4 => 'e'];
// start at the beginning
print reset($sorted); // 'a'
print key($sorted); // 2
print current($sorted); // 'a'
// advance forward
print next($sorted); // 'b'
print key($sorted); // 3
print current($sorted); // 'b'
// advance forward
print next($sorted); // 'c'
print key($sorted); // 1
print current($sorted); // 'c'
// jump to the end
print end($sorted); // 'e'
print key($sorted); // 4
print current($sorted); // 'e'
// there is no next element, so this returns null
print next($sorted);
你几乎永远不需要使用这些函数,但有时候可以使用reset()来方便地获取数组的第一个值,或者用end()获取最后一个值。
<?php
$sorted = [2 => 'a', 3 => 'b', 1 => 'c', 0 => 'd', 4 => 'e'];
print collect($sorted)->first(); // 'a'
print collect($sorted)->last(); // 'e'
print_r(collect($sorted)->take(3)->all()); // [2 => 'a', 3 => 'b', 1 => 'c']
注意take()会保留数组中的键。许多PHP数组函数都接受一个可选的参数$preserve_keys。而这个collections函数库在封装PHP数组函数时,几乎永远都会给这个参数传递true,所以可以认为使用该函数库时,键一直都被保留。
【END】
让你成为Python全栈工程师:
https://edu.csdn.net/topic/python115?utm_source=csdn_bw
热 文 推 荐
PHP 没有真正的数组!相关推荐
- 269道各路算法考试题集锦
1 某编程大赛题(35道题,中等难度) 1.在实际的开发工作中,对于string的处理是最常见的编程任务,本题是要求程序对用户输入的string进行处理,具体要求如下: 1.每个单词的首字母变为大写. ...
- 分割数组(将数组三等分)
简单面试题--分割数组 时间复杂度O(n) //输入:一个自然数数组,选取其中2个数字num[i], num[j], 把数组三分, // 每一部分的累加和(不包括分割点的数字)相等. // 例:num ...
- Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)
RESP 是 Redis 序列化协议Redis Serialization Protocol 的简写.它是一种直观的文本协议,优势在于实现异常简单,解析性能极好. Redis 协议将传输的结构数据 ...
- C++ 笔记(27)— 指针变量、数组和指针、指针数组、数组指针、指针常量与常量指针
1. 什么是指针变量? 指针变量是专门有一个变量来存放指针. int main(int argc, char *argv[]) {int a = 10;int *p = &a; //通过取地址 ...
- Go 学习笔记(63)— Go 中的 for ... range 对切片和数组的差异
1. 迭代对象是切片,迭代过程中修改切片 package mainimport "fmt"func main() {// 示例1.numbers1 := []int{1, 2, 3 ...
- NumPy — 创建全零、全1、空、arange 数组,array 对象类型,astype 转换数据类型,数组和标量以及数组之间的运算,NumPy 数组共享内存
NumPy 简介 一个用 python 实现的科学计算包.包括: 1.一个强大的 N 维数组对象 Array : 2.比较成熟的(广播)函数库: 3.用于整合 C/C++ 和 Fortran 代码的工 ...
- 判断某数组是不是二叉树的前序遍历序列 python递归
code class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) <= 0 ...
- 寻找一个字符串的重复子串 后缀数组
什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...
- 关于C语言中的数组指针、指针数组以及二级指针
概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...
最新文章
- CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3是什么呢?
- const reference const
- 报错:ModuleNotFoundError: No module named ‘cv_bridge‘,以及在ROS是如何安装cv_bridge库包
- Java学习笔记13(equals()方法;toString()方法)
- 串口通信模块1:串口基础知识
- 和sexy_“纸片人”没曲线?Mark这三招,H型身材也能驾驭sexy
- boost::mp11::mp_rotate_right相关用法的测试程序
- awx文件解析_Android so(ELF)文件解析
- cdt开发java_Eclipse:可以将CDT和Java IDE放在一起
- Safari上使用WebRTC指南
- IdentityServer4系列 | 常见术语说明
- “约见”面试官系列之常见面试题之第八十八篇之什么是vue生命周期(建议收藏)
- NOIP2017普及组-1. 成绩
- mysql date timestamp_【Mysql】Datetime和Timestamp区别,及mysql中各种时间的使用
- 大数据之-Hadoop完全分布式_集群中分发脚本xsync_集群环境中同时配置大量主机---大数据之hadoop工作笔记0033
- 新版的iMessage就是iOS 10内隐形的浏览器
- springboot tmp目录生成机制
- JVM结构和JVM的架构模型以及JAVA生命周期介绍
- 奈式准则和香农定理(附例题)
- SFDC中的DEBUG
热门文章
- openshift启动失败
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·010【高级查询】
- hive导数据到mysql 自增主键出错_面试官:MySQL表设计要注意什么?
- Golang关于channel死锁情况的汇总以及解决方案
- 探索pytest的fixture(上)
- 中国机器人清洁器行业市场供需与战略研究报告
- vue 开发中element-ui库的switch开关绑定number类型数据不成功问题 解决方法
- SVN下载,安装,配置,常用操作 svn教程
- Java DatagramPacket 中的坑
- Netbeans 适配C/C++、JAVA防坑秘笈