摘要:李寻欢索引数组索引数组,元素的值和下标不存在逻辑关系,而下标只表示值索引位置。键和值,同时向下移动指针获得元素信息,返回的是,关联和索引数组其中关联数组部分。
数组
数据由元素组成,元素由键和值组成
数组分类关联数组
关联数组,元素的下标与元素的值存在逻辑上的关系,称之为关联数组。指的是,键和值之间存在管理。
$a1 = array("name" => "李寻欢", "age" => 34);
索引数组
索引数组,元素的值和下标不存在逻辑关系,而下标只表示值索引位置。
$a1 = array("李寻欢",34);数组遍历
所要的完成遍历数组,需要依次得到每个元素的信息(键的信息和值的信息).核心在于数组的元素指针上
数组的元素指针
每一个数组内的,都有一个内部的指向某个元素的指针。
默认情况下,这个指针指向数组的第一个元素.
每个数组只有一个指针,同时时刻,只能指向一个元素,因此指针的位置,可以是任意一个已存在的元素。同时指针可能指向数组的外部(数组的末端[最后一个的外边]),就是非法位置.
数组遍历就是
获得指针指向的元素的信息,移动指针,配合循环结构就可以完成。
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所使用的保存元素值的变量,对其操作,不会对原数组产生影响
对值的操作,同时支持引用传递:可以改变原数组的值。
只需要在变量前增加&符号 即可。
foreach流程图
each()foreach也是循环结构, 受break和continue的控制。
遍历每一个
可以获得当前的元素信息。(键和值),同时向下移动指针
获得元素信息,返回的是, 关联和索引数组
其中:
关联数组部分。
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如果指针非法,each返回false。 判断each的返回值
// 先eaech,将each的结果赋给$element // 判断$element 是否成立(自动转成布尔类型) while($element = each($sutdents)) { echo "Key:", $element[0]; echo "$nbsp;"; echo "Value:", $element[1]; echo "
"; }
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 " "; echo "Value:", $v; echo "数组复制元素指针
"; };
如果原数组指针合法:
数组在复制时,指针位置也会随之复制到目标数组内.
$a1 = array("a", "b", "c"); $a2 = $a1; var_dump(current($a2)); // a echo "
"; $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)); // aforeach与数组指针关系
foreach对指针的影响有不确定性,因此不要依赖foreach遍历后的指针位置,如果需要操作,需要先重置(reset();).
数组遍历的是,原数组的拷贝,而不是直接在数组上进行操作.
php内部优化,写时复制(COW--copy on write) .如果不对原数组执行写操作. 是不会发生复制的过程. 在对原数组进行写操作时,这个复制的过程才会发生.
数组复制时的指针问题
foreach遍历的时候,是拷贝,但是发生在对原数组进行操作之后.意味着,在写操作之前,遍历操作的就直接是原数组. 一旦发生了写操作,则会形成一个真实的拷贝,foreach去遍历的数组就与原数组不是同一个. 因此原数组指针就不会继续发生变化. 唯一的例外在最后一次循环体内对数组进行写操作,此时在复制前指针已经非法,则结果会被重置.
在实际操作中,建议处理完毕后,可以立即reset();
上面的问题,只适用于$value ,保存元素值的变量是值传递的情况,如果是引用传递的话.直接操作原数组!
$key不能引用传递.
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 表示略过.
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: 关联
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/21727.html
摘要:学习至今一年有余,笔记积累挺多的,也挺杂的,写篇文章整理一下吧。基础部分输出文本的基础指令和。函数内部声明的变量拥有作用域,只能在函数内部进行访问。布尔型要指定一个布尔值,使用关键字或。 php学习至今一年有余,笔记积累挺多的,也挺杂的,写篇文章整理一下吧。 php基础部分 showImg(http://segmentfault.com/img/bVcWhR); PHP 输出文本...
摘要:中基础中的三大坑,遍历,引用机制,数组。今天我们在讲讲中的一些奇怪现象。本文适合有一定基础的。运行流程共用一个结构体开始遍历数组,进行判断,拷贝数组是一个新的结构体,操作的是新的结构体。那么遍历数组时,全程与原数组无关。 PHP中基础中的三大坑,foreach遍历,引用机制&,数组。 今天我们在讲讲foreach中的一些奇怪现象。 在讲解之前,可以先看看我其他相关的文章,属于同一个大的...
摘要:这种行为比最初出现的问题更为棘手,同时也是一种常见的错误源。这意味着这个数组的一份拷贝将会被返回,因此被调函数与调用者所访问的数组并不是同样的数组实例。 showImg(https://segmentfault.com/img/bV7reP?w=620&h=620); PHP 语言让 WEB 端程序设计变得简单,这也是它能流行起来的原因。但也是因为它的简单,PHP 也慢慢发展成一个相对...
摘要:注意和是不同的变量,处理它们的方式不同变量说明默认情况下包含了,和的数组。包含相同的信息,但它不是一个超全局变量。这些特殊的常量不区分大小写,如下几个的魔术常量名称说明文件中的当前行号。 整理了下关于php的基础知识,参考了些资料,如下: 超全局变量 超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量: $GLOBALS $GLOBALS — 引用全局作用域中可用的全部变量 ...
摘要:代码的编译的解析过程任务就是将代码转化为数组,代码里的所有信息都保存在数组中,然后将数组交给引擎执行,就是内核具体执行的命令,比如赋值加减操作函数调用等,每一条都对应一个处理,这些是提前定义好的函数。 1.PHP代码的编译 PHP的解析过程任务就是将PHP代码转化为opcode数组,代码里的所有信息都保存在opcode数组中,然后将opcode数组交给zend引擎执行,opcode就是...
摘要:本文将会介绍自起,直至中增加的新特征。弃用的功能以下几个功能被弃用,若在配置文件中启用,则会在运行时发出警告。该类的完整限定名是其中第一个反斜杠表示全局命名空间。目的在于模仿的不对,目的是为了让发布应用程序更加方便。 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5...
阅读 3417·2021-11-15 11:39
阅读 1551·2021-09-22 10:02
阅读 1307·2021-08-27 16:24
阅读 3596·2019-08-30 15:52
阅读 3411·2019-08-29 16:20
阅读 822·2019-08-28 18:12
阅读 548·2019-08-26 18:27
阅读 713·2019-08-26 13:32