간단한 소개 및 기본 사용법
PHP 배열의 공통 표준 라이브러리 함수 사용하기
php 배열을 사용하여 공통 데이터 구조 시뮬레이션
PHP 배열 사용 지침 및 주의 사항
FAQ
PHP의 배열은 실제로 순서가 지정된 맵입니다. 맵은 값을 키에 연결하는 유형입니다.
<?php $arr = array(1, 2, 3, 4);
를 통해 일반 배열이 정의됩니다<?php $arr = array(1, 2, 3, 4);
便定义了一个普通数组
我们还可以定义关联数组
<?php $arr = array('a' => 1, 'z' => 100); >1
如果php版本 >= 5.4 , 我们可以使用更为简洁的方式定义数组
<?php $arr = [1, 2, 3, 4]; $arr = ['a' => 1, 'z' => 100]; 123
php 数组很强大, 可以定义混合类型数组
<?php $arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];12
关于数组的访问操作,可以通过[index]
访问:
<?php $arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']]; var_dump($arr[0]); // 1var_dump($arr['arr']); // [1, 'a' => 'b']1234
也可以通过[]
修改数组元素的值
<?php $arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];$arr[0] = 'test'; var_dump($arr); 1234
你也可以在初始化数组继续添加数组元素
<?php$arr = [1, 2, 3, 4]; //追加元素$arr[] = 'a';// 添加 key, value$arr['test'] = 'b';123456
当然,删除数组元素的操作必须支持
<?php$arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];unset($arr['hello']); var_dump($arr['hello']); // null1234
开发中经常需要遍历数组, 可使用 foreach :
<?php $arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];foreach($arr as $key => $value) { var_dump($key . ' => ' . $value); }12345
更多数组遍历的方法请参考php-数组遍历
- 数组之间的比较,数组无法比较大小, 但可以根据一定条件判断是否相等
<?php // $a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE。 // $a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。$a = [1, 2];$b = ['1' => 2, 0 => 1]; var_dump($a == $b); // truevar_dump($a === $b); // false123456789
掌握了数组的基本操作(定义使用,增删改查, 遍历) 之后,你就可以在开发中使用数组, 但只有这些操作是远远不够的,为了满足复杂多变的开发场景对数组操作的需求,php 提供了功能强大的一套 Array 操作的函数
- 获取数组长度
<?php $arr = [1, 2, 3]; var_dump(count($arr)); // 3123
希望判断一个变量是否是数组,可以通过 is_array():
<?php $arr = [1, 2, 3];$notArr = '111'; var_dump(is_array($arr)); // truevar_dump(is_array($notArr)); // false12345
更具key 或者 value, 判断元素 是否在数组中
// 判断key 是否在数组中$arr = ['a' => 2, 4]; var_dump(isset($arr['a'])); // true var_dump(array_key_exists('a', $arr)); // true// 判断 value 是否在数组中in_array(5, $arr); // false1234567
获取数组所有键(keys)
<?php $arr = ['a' => 2, 4];$keys = array_keys($arr); // ['a', 1]123
获取数组的所有值 (values)
<?php $arr = ['a' => 2, 4];$values = array_values($arr); // [2, 4]123
统计数组各个元素值出现的次数 可以使用 array_count_values:
<?php$arr = [1, 3, 2, 'a' => 1, 'b' => 2]; var_dump(array_count_values($arr));/* array(3) { [1]=> int(2) [3]=> int(1) [2]=> int(2) } */1234567891011121314
数组与数组之间的操作:数组可以看做一个集合, 集合间的操作(交集,差集,并集, 补集, 比较等) php 也提供相应的方法实现
数组的合并
<?php$arr1 = ['a' => 1, 2, 'b' => 3];$arr2 = ['b' => 5, 2]; var_dump( array_merge($arr1, $arr2) ); /* array(4) { ["a"]=> int(1) [0]=> int(2) ["b"]=> int(5) [1]=> int(2) } // 你也可以使用 + 操作符, 请注意两种方法结果的差别 var_dump($arr1 + $arr2); */12345678910111213141516171819
如果是需要计算两个或跟多数组value的交集, 可使用 array_intersect
<?php$arr1 = [1, 2, 3];$arr2 = [5, 2]; var_dump( array_intersect($arr1, $arr2) ); // [2]1234
<?php$a = [1, 2];$b = ['1' => 2, 0 => 1, 4];//array_diff 按照索引 和 值 比较差异var_dump(array_diff($a, $b));// array_diff_key() 函数用于比较两个(或更多个)数组的键名 ,并返回差集 var_dump(array_diff_key($a, $b)); 123456789
<?php$arr = [1, 2, 3, 4, 5, 6, 7, 8];// 从第3个元素开始, 直到结束var_dump(array_slice($arr, 2));// 从第3个元素开始, 长度为4var_dump(array_slice($arr, 2, 4));// 从第3个元素开始,到倒数第3个元素var_dump(array_slice($arr, 2, -2));// 注意 索引的差别var_dump(array_slice($arr, 2, -2, true));12345678910111213
[index]
를 통해 액세스할 수 있습니다: <?php// 按照值(value)升序排序, 索引更新$arr = [6,'a'=>2, 3, 4, 6, -1, 7, 8]; sort($arr); var_dump($arr);// 按照值(value)升序排序, 索引保持$arr = [6,'a'=>2, 3, 4, 6, -1, 7, 8]; asort($arr); var_dump($arr);// 按照值(value)降序排序, 索引保持$arr = [6,'a'=>2, 3, 4, 6, -1, 7, 8]; arsort($arr); var_dump($arr);// 按照 键(key)进行升序排序 , 索引保持$arr = ['a' => 10, 'c' => 1, 'b' => 12]; ksort($arr); var_dump($arr);// 按照 键(key)进行降序排序 , 索引保持$arr = ['a' => 10, 'c' => 1, 'b' => 12]; krsort($arr); var_dump($arr);// 用户自定义排序, 根据值(value) , 索引更新// 请注意:对于自定义的比较函数,// 在第一个参数小于,等于或大于第二个参数时,// 该比较函数必须相应地返回一个小于,等于或大于 0 的整数。function cmp($val1, $val2){ if($val1 > $val2) { return 1; } elseif ($val1 == $val2) { return 0; } else { return -1; } }$arr = [ 'a' => 1, 'A' => 3, 'B' => 2, ]; usort($arr, cmp); var_dump($arr);// 根据key 自定义排序规则,请使用 uksort(), 用法同usort()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
[]
를 통해 배열 요소의 값을 수정할 수도 있습니다. <?phpvar_dump(explode(',', "a,a,a,a,a,a")); // 以,为分割符将字符串"a,a,a,a,a,a" 切割成数组var_dump(implode('-', [1, 2, 3, 4, 5])); //以 - 为 拼接符 将 数组[1, 2, 3, 4, 5] 拼接成字符串1234
<?php$stack = [1, 2, 3, 4];//入栈array_push($stack, -1); var_dump($stack); // [1, 2, 3, 4, -1]//出栈$e = array_pop($stack); var_dump($e); // -1var_dump($stack); // [1, 2, 3, 4]1234567891011
<?php$queue = [];//入队列array_unshift($queue, 1); array_unshift($queue, 2); array_unshift($queue, 3); array_unshift($queue, 4);//出队列$e = array_pop($queue); var_dump($e); // 1$e = array_pop($queue); var_dump($e); // 2$e = array_pop($queue); var_dump($e); // 3$e = array_pop($queue); var_dump($e); // 4123456789101112131415161718
<?php$arr = [1, 2, '8' => 3];$arr[false] = -20; var_dump($arr); // [-20, 2, '8' => 3]$arr[8] = 20; var_dump($arr); // [-20, 2, 8 => 20]$arr[8.7] = 15; var_dump($arr); // [-20, 2, 8 => 15]$arr["8.7"] = 10; var_dump($arr); // [-20, 2, 8 => 10]$arr[$val] = 5; // 注意$val之前为声明,因此默认值为null, 数组key为null时会被转为""空串 var_dump($arr); // [-20, 2, 8 => 10, "" => 5]$arr[bar] = 6; // 标识符被转化为 'bar'var_dump($arr); // [-20, 2, 8 => 10, "" => 5, 'bar' => 6]12345678910111213141516171819202122
<?php$var = true; var_dump((array)$var);/* array(1) { [0]=> bool(true) }*/$var = 1; var_dump((array)$var);/* array(1) { [0]=> int(1) }*/$var = 1.1; var_dump((array)$var);/* array(1) { [0]=> float(1.1) }*/$var = "111"; var_dump((array)$var);/* array(1) { [0]=> string(3) "111" }*/$var = null; var_dump((array)$var); // 返回空数组/* array(0) { } */class Cls { public $a = 1; protected $b = 2; private $c = 3; } var_dump((array)(new Cls)); // 可见性不同 key值格式有所不同/* array(3) { ["a"]=> int(1) ["*b"]=> int(2) ["Clsc"]=> int(3) } */123456789101112131415161718192021222324252627282930313233343536373839404142434445
- 배열 길이 가져오기
<?php if (isset($arr[$key]) or array_key_exists($key, $arr)) { ...}1234
추가 키 또는 값을 사용하여 해당 요소가 배열에 있는지 확인하세요
array_intersect
를 사용할 수 있습니다🎜🎜🎜rrreee🎜🎜🎜배열의 차이(값 및 키별)🎜🎜 🎜rrreee🎜🎜🎜하위 배열을 가져와야 하는 경우 array_slice를 사용할 수 있습니다. Python 슬라이싱과 유사한 효과를 생성하려면🎜🎜🎜rrreee🎜🎜🎜 배열 정렬 작업과 관련하여 이는 일반적인 개발 요구 사항이기도 합니다. 🎜php 정렬 기능은 배열 자체에 직접 작용합니다. 새로운 순서의 배열을 반환하는 것보다. 🎜, 다음 코드는 몇 가지 일반적인 시나리오를 제공합니다. 자세한 내용은 PHP를 참조하여 배열을 정렬하세요. 🎜🎜🎜rrreee🎜🎜🎜 배열과 문자열 간의 작업과 관련하여 일반적으로 문자열을 자르고 배열 요소를 문자열로 병합합니다. Explode 및 implode🎜🎜🎜rrreee🎜🎜PHP의 더 많은 배열 관련 기능을 보려면 공식 문서 PHP 배열 함수 목록🎜🎜🎜🎜4을 참조하세요. 일반적인 데이터 구조의 배열 시뮬레이션🎜🎜PHP 배열. 시뮬레이션 가능 가장 명백하게 일반적인 데이터 구조는 매핑 테이블과 사전입니다. 다음은 PHP 배열에 의한 스택 및 큐 시뮬레이션에 대한 간략한 소개입니다. Simulation Stack (FILO) 🎜🎜🎜RRRRREEESIMULATION 큐 (FIFO) 🎜🎜🎜RRRREEE🎜🎜 5. PHP ARRAYSINGRAYSINGRAYSITIMATION 큐 (FIFO) 5. PHP Arrays🎜🎜🎜🎜PHP 배열을 사용할 때주의를위한 지침 및 포인트 키 값은 사용됩니다. 다음 강제 변환🎜 🎜🎜🎜🎜🎜적법한 정수 값이 포함된 문자열이 정수로 변환됩니다. 예를 들어 키 이름 "8"은 실제로 8로 저장됩니다. 그러나 "08"은 합법적인 십진수 값이 아니기 때문에 캐스팅되지 않습니다. 🎜🎜🎜🎜부동 소수점 숫자도 정수로 변환됩니다. 즉, 소수 부분이 반올림됩니다. 예를 들어 키 이름 8.7은 실제로 8로 저장됩니다. 🎜🎜🎜🎜부울 값도 정수로 변환됩니다. 즉, 키 이름 true는 실제로 1로 저장되고 키 이름 false는 0으로 저장됩니다. 🎜Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
因此以下代码可能导致意外的结果,请注意以下代码的输出:
<?php$arr = [1, 2, '8' => 3];$arr[false] = -20; var_dump($arr); // [-20, 2, '8' => 3]$arr[8] = 20; var_dump($arr); // [-20, 2, 8 => 20]$arr[8.7] = 15; var_dump($arr); // [-20, 2, 8 => 15]$arr["8.7"] = 10; var_dump($arr); // [-20, 2, 8 => 10]$arr[$val] = 5; // 注意$val之前为声明,因此默认值为null, 数组key为null时会被转为""空串 var_dump($arr); // [-20, 2, 8 => 10, "" => 5]$arr[bar] = 6; // 标识符被转化为 'bar'var_dump($arr); // [-20, 2, 8 => 10, "" => 5, 'bar' => 6]12345678910111213141516171819202122
关于php数组的类型转换
php数组可以将其他一切类型转为数组,转化的效果请参考一下代码,重点观察对 null 和 object对象的转化:
<?php$var = true; var_dump((array)$var);/* array(1) { [0]=> bool(true) }*/$var = 1; var_dump((array)$var);/* array(1) { [0]=> int(1) }*/$var = 1.1; var_dump((array)$var);/* array(1) { [0]=> float(1.1) }*/$var = "111"; var_dump((array)$var);/* array(1) { [0]=> string(3) "111" }*/$var = null; var_dump((array)$var); // 返回空数组/* array(0) { } */class Cls { public $a = 1; protected $b = 2; private $c = 3; } var_dump((array)(new Cls)); // 可见性不同 key值格式有所不同/* array(3) { ["a"]=> int(1) ["*b"]=> int(2) ["Clsc"]=> int(3) } */123456789101112131415161718192021222324252627282930313233343536373839404142434445
关于PHP类型转换的了解,请参考PHP-类型转换的判别
如何添加数组元素更为高效? array_push($arr, key, value)
or $arr[key] = value
? 答: 后者更为高效, 更多细节请参考官方资料
isset or array_key_exists() ? 答:
对于存在key的数组,如果 对应的value = null , isset($arr[key])
会返回 false;而对于array_key_exists
只要对应key存在就会返回true;
然而在效率方面,isset
效率 高于array_key_eixsts
在判断数组元素是否存在的最佳实践如下:
<?php if (isset($arr[$key]) or array_key_exists($key, $arr)) { ...}1234
数组合并 +
和 array_merge
的区别? 答:可以参考该资料
array_diff
与 ==
的异同? 答:语义有所差别, 数组的相等比较 推荐只使用==
遍历方式那种更高效? 答:foreach 方式 遍历 最为高效
위 내용은 PHP 튜토리얼의 배열에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!