博客列表 >数组种类、数组遍历、数组函数

数组种类、数组遍历、数组函数

乐作人生
乐作人生原创
2020年09月10日 13:04:35752浏览
  1. 数组的种类与定义与访问方式

    1. //数组分类:索引数组、关联数组、多维数组
    2. //1、索引数组:带有数字索引的数组
    3. $goods=[0=>'1001',1=>'小米手机',2=>'3000元',3=>'有货'];
    4. $goods=['1001','小米手机','3000元','有货'];//数组默认从0开始编号,递增为1
    5. $goods=[5=>'1001',1=>'小米手机',8=>'3000元',9=>'有货'];
    6. $goods=[6=>'1001','小米手机','3000元',3=>'有货'];//键值分别为6、7、8、3
    7. printf('<pre>%s</pre>',print_r($goods,true));
    8. echo $goods[6],'<br>';//调取键值对应的值:6=>1001
    9. echo $goods[3],'<hr>';
    10. //追加式创建索引数组,使用默认的键名:默认从0开始,逐渐递增1
    11. $goods=[];
    12. $goods[]='1002';
    13. $goods[]='小米电脑';
    14. $goods[]='5000元';
    15. $goods[]='有货';
    16. printf('<pre>%s</pre>',print_r($goods,true));
    17. echo '<hr>';
    18. //2、关联数组:带有指定键的数组
    19. $goods=['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'];
    20. printf('<pre>%s</pre>',print_r($goods,true));
    21. echo $goods['name'],',',$goods['price'],'<hr>';
    22. //追加式创建关联数组,使用语义化的字符串键名
    23. $goods=[];
    24. $goods['id']='1002';
    25. $goods['name']='小米电脑';
    26. $goods['price']='5000元';
    27. $goods['is']='有货';
    28. printf('<pre>%s</pre>',print_r($goods,true));
    29. echo '<hr>';
    30. //3、多维数组:包含一个或多个数组的数组
    31. //多维数组常用的是二维数组;=> 胖箭头, -> 小箭头
    32. $goods=[
    33. ['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'],
    34. ['id'=>'1002','name'=>'华为手机','price'=>'4500元','is'=>'有货'],
    35. ['id'=>'1003','name'=>'苹果手机','price'=>'6000元','is'=>'无货'],
    36. ];
    37. printf('<pre>%s</pre>',print_r($goods,true));
    38. //多维数组调取数据,苹果手机对应一维中的键名为2,对应二维中的键名为name
    39. echo $goods[2]['name'],'<br>';
    40. echo '类别:'.$goods[0]['name'].',价格:'.$goods[0]['price'],'<br>';
    41. echo '类别:'.$goods[1]['name'].',价格:'.$goods[1]['price'],'<hr>';


  2. 数组的遍历

    1. //数组遍历:逐个遍历、while遍历、for循环遍历、foreach遍历
    2. //定义数组
    3. $goods=[
    4. 'id'=>'1001',
    5. 'name'=>'小米手机',
    6. 'price'=>'3000元',
    7. 'is'=>'有货'
    8. ];
    9. //1、逐个遍历:输出当前指针指向的数组元素的键名和值
    10. //current():值;key():键名
    11. printf('[\'%s\']=>%s<br>',key($goods),current($goods));
    12. //next() 函数将内部指针指向数组中的下一个元素,并输出
    13. next($goods);
    14. printf('[\'%s\']=>%s<br>',key($goods),current($goods));
    15. // prev() - 将内部指针指向数组中的上一个元素,并输出
    16. prev($goods);
    17. printf('[\'%s\']=>%s<br>',key($goods),current($goods));
    18. // end() - 将内部指针指向数组中的最后一个元素,并输出
    19. end($goods);
    20. printf('[\'%s\']=>%s<br>',key($goods),current($goods));
    21. //current() - 返回数组中的当前元素的值
    22. current($goods);
    23. printf('[\'%s\']=>%s<br>',key($goods),current($goods));
    24. // reset() - 复位,将内部指针指向数组中的第一个元素,并输出
    25. reset($goods);
    26. printf('[\'%s\']=>%s<br>',key($goods),current($goods));
    27. echo '<hr>';
    28. //2、while(条件):只要指定的条件成立,则循环执行代码块
    29. while(true){
    30. printf('[\'%s\']=>%s<br>',key($goods),current($goods));
    31. if(next($goods)) continue;
    32. else break;
    33. }
    34. echo '<hr>';
    35. //3、for循环遍历:for(初始值;条件;增量){要执行的代码;}
    36. //for循环只能用于遍历纯索引数组
    37. echo count($goods).'<br>';//count():数组中元素的数目
    38. reset($goods);
    39. for($i=0;$i<count($goods);$i++){
    40. printf('[\'%s\']=>%s<br>',key($goods),current($goods));
    41. next($goods);
    42. }
    43. echo '<hr>';
    44. //for遍历中的复位数组指针和数组下移指针操作必须手动填写,foreach()遍历方法可以省略此步骤
    45. //4、foreach循环遍历;foreach($array as $value){要执行的代码;};每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值
    46. //foreach可以遍历任何类型的数组;$array表示要循环的数组
    47. foreach($goods as $value){//只显示键名对应的值
    48. echo $value.'<br>';
    49. }
    50. echo '<hr>';
    51. foreach($goods as $key=>$value){//可以显示键名和对应的值
    52. printf('[\'%s\']=>%s<br>',$key,$value);
    53. }
    54. echo '<hr>';
    55. //list()用于在一次操作中给一组变量赋值;只用于数字索引的数组
    56. list($a,$b)=['admin',20];
    57. echo $a.',年龄:'.$b.'<br>';
    58. //当list()用于关联数组时,必须填写键名
    59. list('name'=>$a,'age'=>$b,'sex'=>$c)=['name'=>'a1','age'=>25,'sex'=>'女'];
    60. echo '姓名:'.$a.',年龄:'.$b.',性别:'.$c.'<hr>';
    61. $user=[
    62. ['name'=>'a5','age'=>23,'sex'=>'女'],
    63. ['name'=>'a2','age'=>30,'sex'=>'男'],
    64. ['name'=>'a3','age'=>40,'sex'=>'女'],
    65. ];
    66. foreach($user as list('name'=>$a,'age'=>$b,'sex'=>$c)){
    67. printf('name=%s,age=%d,sex=%s<br>',$a,$b,$c);
    68. }
    69. echo '<hr>';
    70. //foreach()既可以遍历数组,也可以遍历对象
    71. $obj = new stdClass;
    72. $obj->name = 'admin';
    73. $obj->email = 'admin@php.cn';
    74. $obj->role = 1;
    75. var_dump($obj);
    76. echo '<hr>';
    77. foreach ($obj as $p => $v) {
    78. echo "$p => $v <br>";
    79. }

  3. 数组函数

    1. //数组函数
    2. //1、键名函数
    3. $goods=['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'];
    4. echo key($goods).'<br>';//获取键名;返回数组内部指针当前指向元素的键名
    5. next($goods);
    6. echo key($goods).'<hr>';
    7. //想要将数组内的所有键名打印出来
    8. $keys=[];
    9. while($key=key($goods)){
    10. $keys[]=$key;
    11. next($goods);
    12. }
    13. print_r($keys);
    14. echo '<hr>';
    15. reset($goods);//复位
    16. //取到所有的键名,还可以自定义函数获取
    17. function array_keys_1($goods){
    18. $keys=[];
    19. while($key=key($goods)){
    20. $keys[]=$key;
    21. next($goods);
    22. }
    23. return $keys;
    24. }
    25. // array_keys($arr): 直接返回键名组成的数组;
    26. print_r(array_keys_1($goods));//获取到所有的键名并组成新的数组
    27. echo '<br>';
    28. //array_key_exists() 判断数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false
    29. //array_key_exists(key,array):key必需。规定键名;array必需。规定数组
    30. echo array_key_exists('name',$goods)?'存在':'不存在';
    31. echo '<br>';
    32. echo array_key_exists('hello',$goods)?'存在':'不存在';
    33. echo '<br>';
    34. //PHP 7 >= 7.3
    35. echo array_key_first($goods);
    36. echo '<br>';
    37. echo array_key_last($goods);
    38. echo '<hr>';
    39. // 2、和值相关的函数
    40. $arr = [3 => 10, 9 => 20, 0 => 'html', 'id' => 'css', 20 => 20, 30];
    41. printf('<pre>%s</pre>',print_r($arr,true));
    42. //只获取值
    43. $values=[];
    44. foreach($arr as $value){
    45. $values[]=$value;
    46. }
    47. printf('<pre>%s</pre>',print_r($values,true));
    48. //array_values():返回数组中所有的值(不保留键名)
    49. print_r(array_values($arr));
    50. echo '<hr>';
    51. //in_array() 函数搜索数组中是否存在指定的值
    52. $a=['ab','html','css','php'];
    53. echo in_array('ab',$a) ?'找到':'未找到';
    54. echo '<br>';
    55. echo in_array('ho',$a)?'找到':'未找到';
    56. echo '<hr>';
    57. // array_search() 函数在数组中搜索某个键值,并返回对应的键名
    58. // array_search(value,array,strict):value必需。规定在数组中搜索的值;array必需。规定被搜索的数组;
    59. // strict可选。如果该参数被设置为 TRUE,则函数在数组中搜索数据类型和值都一致的元素;数字 5 和字符串 5 是不同的。false - 默认
    60. $b=["a"=>"5","b"=>5,"c"=>"45"];
    61. echo array_search('css',$a,true);//找到css这个值对应的键名2
    62. echo '<br>';
    63. echo array_search('5',$b);//如果在数组中找到键值超过一次,则返回第一次找到的键值所匹配的键名
    64. echo '<hr>';
    65. //array_unique()去重
    66. print_r(array_unique($arr));//去掉重复的值20
    67. $c=["a"=>"red","b"=>"green","c"=>"red"];
    68. echo '<br>';
    69. print_r(array_unique($c));
    70. echo '<hr>';
    71. //array_sum() 函数返回数组中所有值的和
    72. $arr = [10,20,30,55,99];
    73. echo array_sum($arr);
    74. echo '<hr>';
    75. //3、增加或删除数组中的元素
    76. // 栈与队列。 栈: 是仅允许在一端进行增删的数组,先进的后出
    77. $stack=[];
    78. // 1)在尾部进行增加删除
    79. //array_push() 函数向数组尾部插入一个或多个元素
    80. array_push($stack, 10);
    81. array_push($stack, 20);
    82. array_push($stack, 30, 40);
    83. //array_pop() 函数删除数组中的最后一个元素
    84. // 在尾部出栈, 每次只允许出来一个
    85. echo array_pop($stack);
    86. printf('<pre>%s</pre>',print_r($stack,true));
    87. echo '<hr>';
    88. // 2)在头部进行增加删除
    89. $arr=[];
    90. //array_unshift() 函数用于向数组插入新元素。新数组的值将被插入到数组的开头;最后进入的元素排在最前面
    91. array_unshift($arr, 'html', 'css', 'js');
    92. array_unshift($arr, 'abc', 'ef');
    93. //array_shift() 函数用于删除数组中的第一个元素,并返回被删除的元素
    94. echo array_shift($arr);
    95. printf('<pre>%s</pre>',print_r($arr,true));
    96. echo '<hr>';
    97. //队列: 允许在两头进行增删,先进的先出
    98. $queue = [];
    99. // 尾部进队 + 头部出队:array_push()+array_shift()
    100. array_push($queue, 10,20,30);
    101. echo array_shift($queue);
    102. printf('<pre>%s</pre>',print_r($queue,true));
    103. echo '<hr>';
    104. // 头部进队 + 尾部出队:array_unshift()+array_pop()
    105. $ef=[];
    106. array_unshift($ef, 10,20,33);
    107. echo array_pop($ef);
    108. printf('<pre>%s</pre>',print_r($ef,true));
    109. echo '<hr>';
    110. //4、数组的排序
    111. //1)sort() - 对数组进行升序排列;字母始终在数字前面,然后再按照字母升序排序
    112. $item = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
    113. printf('<pre>%s</pre>',print_r($item,true));
    114. sort($item);//函数的操作会影响原始的数组,原始数组中0=>30,sort()操作后0=>abc
    115. printf('<pre>%s</pre>',print_r($item,true));
    116. //2)rsort() - 对数组进行降序排列
    117. rsort($item);
    118. printf('<pre>%s</pre>',print_r($item,true));
    119. echo '<hr>';
    120. //3)-6)的函数的键值对应关系均会保留
    121. // 3)asort() - 根据数组的值,对数组进行升序排列
    122. $a=['e' => 10, 'a' => 3, 'p' => 5,'b'=>66];
    123. printf('<pre>%s</pre>',print_r($a,true));
    124. asort($a);
    125. printf('<pre>%s</pre>',print_r($a,true));
    126. //4)arsort() - 根据数组的值,对数组进行降序排列
    127. arsort($a);
    128. printf('<pre>%s</pre>',print_r($a,true));
    129. //5)ksort() - 根据数组的键,对数组进行升序排列
    130. ksort($a);
    131. printf('<pre>%s</pre>',print_r($a,true));
    132. //6)krsort() - 根据数组的键,对数组进行降序排列
    133. krsort($a);
    134. printf('<pre>%s</pre>',print_r($a,true));
    135. echo '<hr>';
    136. // 7)usort() 使用用户自定义的比较函数对数组进行排序
    137. $arr=[4,2,8,6];
    138. usort($arr,function($a,$b){
    139. // return $a-$b;//由小到大进行排序
    140. return $b-$a;//由大到小进行排序
    141. });
    142. printf('<pre>%s</pre>',print_r($arr,true));
    143. //8)natsort() 函数用"自然排序"算法对数组进行排序。保留它们原始的键值对应关系
    144. $arr = ['img1.jpg', 'img5.jpg', 'img10.jpg', 'img8.jpg'];
    145. printf('<pre>%s</pre>',print_r($arr,true));
    146. natsort($arr);
    147. printf('<pre>%s</pre>',print_r($arr,true));
    148. echo '<hr>';
    149. //5、array_slice(): 从数组中取出一部分元素
    150. //array_slice(array,start,length,preserve):array必需。要进行操作的数组;
    151. // start必需。数值。规定取出元素的开始位置。 0 = 第一个元素。 如果该值设置为正数,则从前往后开始取。如果该值设置为负数,则从后向前取,-2表示从数组的倒数第二个元素开始;
    152. // length可选。规定被返回数组的长度;默认从开始位置到结尾;果该值设置为负数,则函数将在距离数组末端这么远的地方终止取出
    153. //preserve可选。规定函数是保留键名还是重置键名;true - 保留键名;false - 默认。重置键名
    154. $arr=['red','green','blue','yellow','brown'];
    155. printf('<pre>%s</pre>',print_r($arr,true));
    156. $item=array_slice($arr,1);//从数组的第2个键开始调取
    157. printf('<pre>%s</pre>',print_r($item,true));
    158. $item=array_slice($arr,-1);//从数组的倒数第1个键开始调取
    159. printf('<pre>%s</pre>',print_r($item,true));
    160. $item=array_slice($arr,1,-1);//在距离结尾1个元素的时候终止获取
    161. printf('<pre>%s</pre>',print_r($item,true));
    162. $item=array_slice($arr,1,2,true);//获取的时候保留原始键值对应关系
    163. printf('<pre>%s</pre>',print_r($item,true));
    164. echo '<hr>';
    165. //6、array_splice() 函数从数组中删除选定的元素,并用新元素取代它。函数也将返回被移除元素的数组
    166. //array_splice(array,start,length,arrays):array必需。规定数组;start必需。规定删除元素的开始位置。 0 = 第一个元素。如果该值设置为负数,则从数组末端倒数该值指定的偏移量开始删除。 -2 表示从数组的倒数第二个元素开始
    167. // length可选。规定被删除的元素个数;如果该值设置为负数,则删除从 start 到数组末端倒数 length 为止中间所有的元素。如果该值未设置,则删除从 start 参数设置的位置开始直到数组末端的所有元素
    168. // arrays可选。规定带有要插入原始数组中元素的数组
    169. $arr = [10, 28, 9, 33, 56, 21, 82, 47];
    170. printf('<pre>%s</pre>',print_r($arr,true));
    171. // $res = array_splice($arr, 1, 3);//从数组的第2个键开始删除,共删除3个
    172. // // 返回值就是被删除的元素组成的数组
    173. // printf('<pre>%s</pre>',print_r($res,true));
    174. // $res = array_splice($arr, -4, 3);//从数组的倒数第4个元素开始删除,共删除3个
    175. // printf('<pre>%s</pre>',print_r($res,true));
    176. $res = array_splice($arr, 1,-3);//从数组的第2个元素到倒数第3个元素之间的所有元素
    177. printf('<pre>%s</pre>',print_r($res,true));
    178. echo '<hr>';
    179. //替换、增加
    180. $arr=[4,2,8,6,20,40];
    181. printf('<pre>%s</pre>',print_r($arr,true));
    182. $res=array_splice($arr,1,2,[22,33]);//将数据第2个到第3个之间的元素替换成22,33
    183. printf('<pre>%s</pre>',print_r($arr,true));
    184. $res=array_splice($arr,1,0,[12,53]);//将[12,53]增加到原始数组中的第2个元素位置后面
    185. printf('<pre>%s</pre>',print_r($arr,true));
    186. echo '<hr>';
    187. //7、array_filter(): 过滤数组中的元素,只返回计算结果为"true"的元素组成的数组
    188. // 以下六种类型的数据会自动转为false
    189. var_dump(boolval([]));
    190. var_dump(boolval(null));
    191. var_dump(boolval(0));
    192. var_dump(boolval('0'));
    193. var_dump(boolval(''));
    194. var_dump(false);
    195. //php 里的标量就是 int , string , bool , float 这几种类型
    196. $a1=['a','b',2,3,4,(new class {}),[23,44],[],null,0];
    197. $a2=array_filter($a1,function ($item){
    198. return $item;//return boolval($item)的简写
    199. });
    200. printf('<pre>%s</pre>',print_r($a1,true));
    201. printf('<pre>%s</pre>',print_r($a2,true));
    202. // 如果只是简单的过滤掉false值,可以不写回调函数,简写成$a2 = array_filter($a1);
    203. // 如果对返回的为true的元素,进行再次的处理, 就必须要写回调参数
    204. $a2 = array_filter($a1,function($item){
    205. // return is_scalar($item) && $item;// 只返回标量: 字符串, 数值, 布尔,浮点类型
    206. return is_object($item);// 只返回对象
    207. // return is_array($item) && $item;// 只返回数组
    208. });
    209. printf('<pre>%s</pre>',print_r($a2,true));
    210. echo '<hr>';
    211. //8、array_map()为数组中的每一个元素应用回调函数进行处理,并返回一个新数组
    212. $arr = ['php',[3,4,5], (new class {public $name='电脑';public $price=8888;}), 15, 20];
    213. printf('<pre>%s</pre>',print_r($arr,true));
    214. // 1)如果元素是对象: 就输出它的属性
    215. // 2)如果元素是数组,就转为字符串输出
    216. // 3)其它元素,直接输出
    217. $res=array_map(function($item){
    218. switch(gettype($item)) {//gettype() 获取变量的类型
    219. case 'object':
    220. $item = implode(',', get_object_vars($item));//get_object_vars()返回由对象属性组成的关联数组
    221. break;
    222. case 'array':
    223. $item = implode(',', $item);//implode() 把数组元素组合成一个字符串
    224. break;
    225. }
    226. return $item;
    227. }, $arr);
    228. printf('<pre>%s</pre>',print_r($res,true));
    229. echo '<hr>';
    230. //9、array_reduce(): 元素迭代处理形成单一的返回值;发送数组中的值到用户自定义函数,并返回一个字符串
    231. //array_reduce(array,function,initial):array必需。规定数组;function必需。规定函数的名称;initial可选。规定发送到函数处理的第一个值
    232. $arr = [1,2,3,4,5];
    233. $res = array_reduce($arr, function($prev, $next){
    234. //求和,当前的运算结果,实际上通过$prev返回
    235. return $prev += $next;
    236. });
    237. print_r($res);
    238. echo '<br>';
    239. function my($v1,$v2)
    240. {
    241. return $v1 . "-" . $v2;
    242. };
    243. $a=array("Dog","Cat","Horse");
    244. print_r(array_reduce($a,"my",5));
    245. echo '<br>';
    246. $arr = [1,2,3,4,5];
    247. $res = array_reduce($arr, function($prev, $next){
    248. //求和,当前的运算结果,实际上通过$prev返回
    249. return $prev += $next;
    250. },7);//7+1+2+3+4+5
    251. print_r($res);
    252. echo '<hr>';
    253. //10、implode() 把数组元素组合成一个字符串
    254. //implode(separator,array):separator可选。规定数组元素之间放置的内容,默认是 ""(空字符串);array必需。要组合为字符串的数组
    255. $arr = [1,2,3,4,5];
    256. $res=implode('-',$arr);
    257. printf('<pre>%s</pre>',print_r($res,true));
    258. //explode() 分割字符串;使用一个字符串分割另一个字符串,并返回由字符串组成的数组
    259. $str = "www.php.com";
    260. $abc=explode('.',$str);//在.处进行分割
    261. printf('<pre>%s</pre>',print_r($abc,true));
    262. echo '<hr>';
    263. //11、extract()将关联数组的键值对转为一个个独立的变量, 变量名就是原来的键名
    264. //extract(array,extract_rules,prefix):array必需。规定要使用的数组
    265. // extract_rules可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突;prefix可选
    266. $config = [
    267. 'type' => 'mysql',
    268. 'host' => 'localhost',
    269. 'dbname' => 'php',
    270. 'charset' => 'utf8'
    271. ];
    272. extract($config);
    273. echo $type.',', $host.',', $dbname.',', $charset;
    274. echo '<hr>';








声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议