Blogger Information
Blog 15
fans 0
comment 0
visits 11247
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
数组种类、数组遍历、数组函数
乐作人生
Original
758 people have browsed it
  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>';








Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:数据的声明,赋值,遍历,更新等是最常用的操作
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post