PHP_数组

虚烬
• 阅读 2360

数组

数据由元素组成,元素由键和值组成

数组分类

关联数组
关联数组,元素的下标与元素的值存在逻辑上的关系,称之为关联数组。指的是,键和值之间存在管理。

$a1 = array('name' => '李寻欢', 'age' => 34);    

索引数组
索引数组,元素的值和下标不存在逻辑关系,而下标只表示值索引位置。

$a1 = array('李寻欢',34);

数组遍历

所要的完成遍历数组,需要依次得到每个元素的信息(键的信息和值的信息).核心在于数组的元素指针上

数组的元素指针

每一个数组内的,都有一个内部的指向某个元素的指针。
默认情况下,这个指针指向数组的第一个元素.
每个数组只有一个指针,同时时刻,只能指向一个元素,因此指针的位置,可以是任意一个已存在的元素。同时指针可能指向数组的外部(数组的末端[最后一个的外边]),就是非法位置.

PHP_数组

数组遍历就是
获得指针指向的元素的信息,移动指针,配合循环结构就可以完成。

php提供

  • 得到指针所指向的元素的信息

  • 可以移动指针

current(); 得到当前指针指向元素的值
key(); 得到当前指向元素的键
next(); 可以移动数组的指针

prev(); 向上移动一个元素.
reset(); 重置指针(移动到第一个元素)
end(); 移动到最右一个元素

数组末端,最右一个元素往右,非法的范围

next(), 和prev(); 可以将数组指针移动到非法位置上.

//$students 是数组
end($students);
next($students);
var_dump(current($students)); //false;

reset($students);
prev($students);
var_dump(current($students)); //false;

如果已经移动到非法位置,不可相对移动来挽回,此时,需要强制移动到某个位置, reset() , 和 end()


//$students 是数组
end($students);
next($students);
prev($students);
var_dump(current($students)); //false;

reset($students);
prev($students);
next($students);
var_dump(current($students)); //false;

foreach()

foreach(); 结构
专门用于数组遍历的一个结构,也是一个循环结构

foreach ( $arr as $key => $val ) {
    //循环体
}

如果元素的键,没有意义的话,可以使用 省略键的信息

foreach ( $arr as $val ) {}

注意:

foreach会移动数组指针,并且,在foreach遍历完毕后,指针处于非法位置(数组末端)
foreach在遍历一个数组元素时,会初始化元素指针,因此指针所指向的位置,不会影响到foreach的遍历
foreach在遍历时,原数组的拷贝,而不是直接在原数组进行遍历,如果在遍历过程中,对遍历的数组进行修改,是不会影响到遍历的结果
foreach所使用的保存元素值的变量,对其操作,不会对原数组产生影响
对值的操作,同时支持引用传递:可以改变原数组的值。

只需要在变量前增加&符号 即可。

PHP_数组

foreach流程图

PHP_数组

foreach也是循环结构, 受break和continue的控制。

each()

遍历每一个
可以获得当前的元素信息。(键和值),同时向下移动指针
获得元素信息,返回的是, 关联和索引数组
其中:
关联数组部分。

key => 当前元素的键
value => 元素的值

索引数组部分

0 => 元素的下标
1 => 元素的值

$arr = array(10, 12, 200);

$arr2 = array(
    'name' => 'zf',
    'age' => 20
);

var_dump(each($arr));
var_dump(each($arr2));

只遍历第一项
由于each既可以获取元素信息,又可以移动指针,因此非常适合完成除foreach外的手动的数组的遍历.

each+while+list的遍历数组

each如果指针非法,each返回false。 判断each的返回值

// 先eaech,将each的结果赋给$element
// 判断$element 是否成立(自动转成布尔类型)

while($element = each($sutdents)) {
    echo 'Key:', $element[0];
    echo '$nbsp;';
    echo 'Value:', $element[1];
    echo '<br/>';
}
    

list()
可以使在遍历的循环体内直接使用保存元素下标的变量.直接使用保存元素下标的变量和保存元素值的变量.
一个函数,可以通过一个数组,针对多个变量同时初始化

   
$student = array('李寻欢', '天机老人', '阿飞');

list($a, $b, $c) = $student; // 将数组内的元素, 以此赋值给list结构中的变量    // 类似 es6 中的解构赋值

var_dump($a, $b, $c);

list 针对索引数组生效

$student = array('李寻欢', '天机老人', '阿飞');

while (list($k, $v) = each($student)) {
    
    echo 'Key:', $k;
    
    echo '&nbsp;';
    
    echo 'Value:', $v;
    
    echo '<br/>';
    
};

数组复制元素指针

如果原数组指针合法:
数组在复制时,指针位置也会随之复制到目标数组内.

$a1 = array('a', 'b', 'c');

$a2 = $a1;
var_dump(current($a2));  // a

echo '<hr/>';

$a1 = array('a', 'b', 'c');
next($a1);

$a2 = $a1;
var_dump(current($a2)); // b

如果原数组指针非法:
将重置新数组的指针; 重置为默认指针.

$a1 = array('a', 'b', 'c');

end($a1);

next($a1);

$a2 = $a1;

var_dump(current($a2)); // a

foreach与数组指针关系

foreach对指针的影响有不确定性,因此不要依赖foreach遍历后的指针位置,如果需要操作,需要先重置(reset();).

数组遍历的是,原数组的拷贝,而不是直接在数组上进行操作.
php内部优化,写时复制(COW--copy on write) .如果不对原数组执行写操作. 是不会发生复制的过程. 在对原数组进行写操作时,这个复制的过程才会发生.
数组复制时的指针问题

PHP_数组

foreach遍历的时候,是拷贝,但是发生在对原数组进行操作之后.意味着,在写操作之前,遍历操作的就直接是原数组. 一旦发生了写操作,则会形成一个真实的拷贝,foreach去遍历的数组就与原数组不是同一个. 因此原数组指针就不会继续发生变化. 唯一的例外在最后一次循环体内对数组进行写操作,此时在复制前指针已经非法,则结果会被重置.

在实际操作中,建议处理完毕后,可以立即reset();
上面的问题,只适用于$value ,保存元素值的变量是值传递的情况,如果是引用传递的话.直接操作原数组!
$key不能引用传递.

array函数

常用函数

array_fill(起始位置,长度,内容); //使用固定值填充某些数量的元素.
count(); //统计数组元素个数. 支持递归统计.
range(起始范围,结束范围); //按照范围创建数组元素.
array_merge(); //合并多个数组.

// 注意一个下标冲突的情况,如果索引下标冲突,顺序增加.
// 关联数组冲突. 后合并的要覆盖前面的.
array_merge(range('a','z'),range('A','Z'));

array_rand(数组,选择的数量[默认一个]); //随机从数组中取得某些元素. 得到的是随机的下标,而不是元素值. 并且,如果是多个元素,会按照下标的大小进行排序.

shuffe(); //打乱元素顺序,参数是引用传递.

// 验证码中的 4位 随机数

// 创建一个大小混合的数组
$chars = array_merge(range('a','z'),range('A','Z'));

// 取得4个元素下标

$rand_keys = array_rand($chars, 4);

// 打乱
shuffle($rand_keys);

// 利用下标获取元素值
foreach ($rand_keys as $v) {
    echo $chars[$v];
}
    

键值操作

array_value(); //取得所有元素的所有值.
array_key(); //取得所有元素的所有键.

array_combine(); // 利用两个数组,其中一个为 键 ,另一个为值得到一个新数组.
in_array(); //判断数组中是否有某个值
array_key_exists(); //是否有某个元素.

array_search(); // 在数组内查找某个元素值,找到返回 下标. 找不到返回false.
array_filp(); // 交换元素的键和值.

合并拆分

'+'号

$a1 = array(1, 2, 3, 4);
$a2 = array(6, 7, 8);
var_dump($a1+$a2); // 如果出现下标冲突,则忽略后边的元素

array_merge($arr1, $arr2); // 合并多个数组.
array_chunk($arr, len); //按照子数组的长度,进行对原数组拆分.

explode(); //将一个字符串,按照某个字符,分割成多个部分.
implode(); //可以将数组元素的值, 利用某个字符,连接

$arr = array('aa', 'bb');

echo $arr = implode('-', $arr);  // aa-bb

print_r(explode('-', $arr));

compact(); 合并, 利用多个变量,合并成一个数组. 其中变量的名字作为数组的下标. 变量的值,作为值. 注意参数是变量名

$width = 2;
$height = 10;

$arr = compact('width', 'height');

extact(); 拆分,将一个变量,拆分成一个变量。每一个元素为一个变量。 下标为变量名,值为变量值. 字符串的下标.
注意,如果当前已经存在变量名,则会发生将已有变量值替换的操作.这个是默认行为.可以修改,通过extact(),第二个参数. 默认为EXTR_OVERWRITE表示重写 //EXTR_SKIP 表示略过.

PHP_数组

array_diff(数组1,数组2); // 得到数组1中与数组2中不相同的元素. -- 差集 值判断.
array_intersect(数组1,数组2);// 得到数组1中与数组2中相同的元素. --交集.

array_map($callback, $arr1); // 对数组内的每个元素,进行一次操作.分别调用某个函数进行一次调用.
如果函数是自定义的.
注意,应该有参数接收元素值,同时应该有返回值

$a1 = array(10, 20, 3);

function x2 ( $item ) {
    return $item * 3;
}

$arr = array_map('x2', $a1);

var_dump($arr);

只负责定义,不负责调用. array_map(); 函数内部负责调用.
可以同时接收或处理.是统一操作,一次将所有数组相同位置都操作一遍,而不是逐一操作. 因此该函数所接受的参数个数,与所传递的数组的数量应该一致.
有一个默认操作,非常常用,利用多个数组,组合成一个新数组。要求,函数位置传递一个null.

$names = array('z1', 'z2', 'z3');

$maths = array(50, 40, 60);

$score = array_map(null, $names, $maths);

var_dump($score);

回调函数的使用-模拟数据结构函数-排序函数


array_walk($funcname);
针对一个数组的每个元素进行操作,与array_map的不同点.

  • array_map() 可以操作多个数组,而array_walk(); 只可以操作一个数组.

  • array_map(); 只可以得到元素值,而array_walk(); 即可以得到元素值,还可以得到元素的键.

  • 可以对函数的第一个参数进行引用传递,达到修改的原有数组的目的.

$names = array('aa', 'bb', 'cc');

function fn1 ( &$val,$key ) {
    var_dump($val,$key);
}

array_walk($names, 'fn1');

模拟数据结构

入栈 array_push();
出栈 array_pop();
// 每次操作后,索引都会重新索引.

顶端出: array_shift();
顶端入: array_unshift();

排序函数

soft(); 按照值升序
rsoft() 按照值降序
ksoft()按照键升序
krsoft(); 按照键降序
// 值排序,不会保留键值关系,而键排序会保留键值关系.
// 按照值排序,同时保留键值关系.

asort(); 按照值,升序,保留键值关联.
arsort(); 按照值,降序,保留键值关联.

key,键
reverse(): 反序,默认是升序.
association: 关联

点赞
收藏
评论区
推荐文章
好买-葡萄 好买-葡萄
3年前
【数据结构与算法】—— 二分查找
1.二分查找的概念二分查找指的是在排好序的数组中,找到目标元素。如果元素存在则返回元素的下标,不存在则返回1.下面以升序为例进行简单描述2.查找过程:取数组中间元素与查找元素target比较。如果target等于中间元素则直接返回中间元素的下标,如果target小于数组中间元素则在数组左边查找,如果target大于数组中间元素则在右边查找。重复以上步骤。
Bill78 Bill78
4年前
Python 字典常用方法总结
Python字典可存储任意类型对象,如字符串、数字、元组……优点:取值方便,速度快1,创建字典字典由键(key)和对应值(value)成对组成。字典也被称作关联数组或哈希表。基本语法如下:dict{'Alice':'2341','Beth':'9102','Cecil':'3258'}注意:每个键与值用冒号隔开(:)
Wesley13 Wesley13
3年前
Go 定长的数组
1.Go语言数组的简介  几乎所有的计算机语言都有数组,应用非常的广泛。同样,在Go语言中也有数组并且在数组的基础上还衍生出了切片(slice)。数组是一系列同一类型数据的集合,数组中包含的每个数据被称为数组元素,一个数组包含的元素个数被称为数组的长度,这是数组的基本定义。  在Go语言中数组是一个值类型(ValueType)
Wesley13 Wesley13
3年前
Java中的数组(Array)
数组对于每一门编程语言来讲都是最重要的数据结构之一,当然不同的编程语言对数组的实现以及处理也不尽相同。数组的概念:把有限个相同类型元素变量放在一个整体,这个整体就叫做数组。数组中的每一个元素被称为数组元素,通常可以通过数组元素的索引(也叫下标,可以理解为一种编号,从0开始)来访问数组元素,包括数组元素的赋值(set)和取值(get)。
Wesley13 Wesley13
3年前
MongoDB学习系列11:MongoDB中的修改器
使用修改器时,"\_id"的值不能改变,而整个文档在替换时是可以改变"\_id"的。$set用来修改一个键的值。$unset用来删除一个键。$inc用来增加已有键的值,或者在键不存在时创建一个键。只能用于整数、长整数、或者双精度浮点数。$push往数组里添加东西,$pop从数组中删除元素。{$pop:{key:1}}从数据末
Stella981 Stella981
3年前
JavaScript遍历循环
定义一个数组和对象constarr'a','b','c','d','e','f';constobj{a:1,b:2,c:3,d:4}for()经常用来遍历数组元素遍历值为数组元素索引f
Stella981 Stella981
3年前
HashMap 的底层实现原理
HashMap是一个用于存储KeyValue键值对的集合,每一个键值对也叫做Entry。这些个Entry分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。 !(https://oscimg.oschina.net/oscnet/8495d30fe00a2865dd74088d2
Wesley13 Wesley13
3年前
C语言自学《五》
什么是数组数组是一组数目固定、类型相同的数据项数组中的数据称为元素比如longnumbers\10\;方括号中的数字定义了要存放在数组中的元素个数,称为数组维度数组有一个类型,它组合了元素的类型和数组中的元素个数,因此如果两个数组的元素个数、类型相同,这两个数组的类型就相同可以在数组名称后的方括号内使用索引值,索引值是从0开始
Stella981 Stella981
3年前
Javascript数组系列一之栈与队列
所谓数组(英语:Array),是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。---百度百科简单理解,数组就是数据的有序列表。Array在Javascript中属于最常用的数据类型之一了,与其它语言一样Javascript中的数
Wesley13 Wesley13
3年前
C#图解教程 第十二章 数组
数组数组数组实际上是由一个变量名称表示的一组同类型的数据元素。每个元素通过变量名称和一个或多个方括号中的索引来访问:数组名索引↓↓MyArray4定义让我们从C中与数组有关的重要定义开始元素数组的独立数据项称为元素。数组的所有元素必须
分布式系统的主键生成方案对比 | 京东云技术团队
UUID​UUID(通用唯一识别码)是由32个十六进制数组成的无序字符串,通过一定的算法计算出来。为了保证其唯一性,UUID规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。