一些php数组的学习入门笔记

在php数组中有三种类型:数值数组 带有数字 ID 键的数组 关联数组 数组中的每个 ID 键关联一个值 多维数组 包含一个或多个数组的数组,好了现在来看我的笔记吧.

实例代码如下:

  1. header('Content-Type: text/html; charset=utf-8');
  2. echo '<pre>';
  3. function var_array($array)
  4. {
  5. echo '<pre>';
  6. var_dump($array);
  7. echo '</pre>';
  8. }
  9. function printr($array)
  10. {
  11. echo '<pre>';
  12. print_r($array);
  13. echo '</pre>';
  14. }
  15. function getArr($sNum, $eNum=1, $step=1)
  16. {
  17. $arr = range($sNum, $eNum, $step);
  18. $reArr = array();
  19. foreach($arr as $v)
  20. {
  21. $reArr[$v] = rand(0,10);
  22. }
  23. unset($arr);
  24. return $reArr;
  25. }
  26. /**
  27. * array数组练习
  28. */
  29. //---------------------------------------------
  30. //array_change_key_case() 改变数组索引的大小写字母,由最后一个参数决定:CASE_UPPER(转化为大写),CASE_LOWER(默认 转化为小写)
  31. $expArr = array(
  32. 'fiRsT' => '1',
  33. 'sEcoNd' => '2',
  34. 'ThIrd' => array(
  35. 'HuiMa' => '3',
  36. 'nengZhuaNma' => '5',
  37. )
  38. );
  39. printr(array_change_key_case($expArr));//全转化为小写
  40. printr(array_change_key_case($expArr['ThIrd'], CASE_UPPER));//全转化为大写 只对$expArr数组里的某个index键转化
  41. //总结:该函数只影响数组的一层. 并且不会对原数组产生影响
  42. echo '<br/><hr/><br/>';
  43. //---------------------------------------------
  44. //array_chunk($array, $size, false)
  45. //将一个数组分割成一个多维数组,size决定这个数组每$size个成为一个多维数组, true/false决定新数组的键值是否沿用原数组的键
  46. $expArr = array('4','2','6','d','2');
  47. printr(array_chunk($expArr, 3));
  48. //总结:该函数只影响数组的一层. 并且不会对原数组产生影响
  49. echo '<br/><hr/><br/>';
  50. //---------------------------------------------
  51. //array_combine($keyArr, $valArr)
  52. //将两个数组组合成一个数组,$keyArr做为键,$valArr做为值
  53. $expKey = array('g', 'd', 't');
  54. $expVal = array('5', '8', '7');
  55. printr(array_combine($expKey, $expVal));
  56. //该函数同样只影响数组的一层,并且返回一个新数组
  57. echo '<br/><hr/><br/>';
  58. //---------------------------------------------
  59. //array_count_values($array)
  60. //统计$array数组中每个value出现的次数,并以他个value做为新数组的键,出现次数做为value
  61. $array = array('v1'=>'265', 'v2'=>'352', 'v3'=>'265', 'v4'=>'349', 'v5'=>'265');
  62. printr(array_count_values($array));
  63. //总结:该函数只能用于统计值为 string和integer类型的value,其他类型会发warning!
  64. echo '<br/><hr/><br/>';
  65. //---------------------------------------------
  66. //array_diff($array1, $array2...)
  67. //以$array1为基础数组,他的值不出现在其他任何参数数组里的值组成一个新数组
  68. $arr1 = array('v4'=>458, 'gren', 'b5', 'a5');
  69. $arr2 = array('v4'=>598, 'red', 'a5', 'c4');
  70. printr(array_diff($arr1, $arr2));
  71. //总结:拿一个数组到一堆数组中找出这个数组中没有的值,统计、数据对比应该会用到
  72. //array_intersect($array, $parArr, ....)
  73. //该函数同array_diff在功能上一样,只是array_intersect()返回的是共有的数据,array_diff则是只存在于$array中的数据
  74. //
  75. echo '<br/><hr/><br/>';
  76. //---------------------------------------------
  77. //array_diff_assoc($array1, $array2...)
  78. //同 array_diff()函数,但是这个也会拿key进行对比
  79. //
  80. echo '<br/><hr/><br/>';
  81. //---------------------------------------------
  82. //array_diff_key
  83. //同array_diff()函数
  84. //只是这个只拿$array1的key去与其他参数数组进行查找
  85. //
  86. echo '<br/><hr/><br/>';
  87. //---------------------------------------------
  88. //array_diff_uassoc($arr1, $parArr...., 回调函数)
  89. //功能同array_diff(),但是需要用户定义一个回调函数
  90. //未明白该函数的作用
  91. //
  92. echo '<br/><hr/><br/>';
  93. //---------------------------------------------
  94. //array_diff_ukey($arr1, $parArr...., 回调函数)
  95. //功能同array_diff_key(),只不过和array_diff_uassoc一样,需要一个回调函数
  96. //
  97. //
  98. echo '<br/><hr/><br/>';
  99. //---------------------------------------------
  100. //array_fill($startInt, $numInt, $value)
  101. //把$value填充到一个新数组,新数组的索引起始位置开始由$startInt决定,$numInt则控制这个数组生成多少个索引.
  102. //tip:除了$value,$startInt,$numInt必须为数字,否则报错
  103. printr(array_fill(2, 5, 'value'));
  104. //总结:还没想到干啥用
  105. echo '<br/><hr/><br/>';
  106. //---------------------------------------------
  107. //array_fill_keys($arrKeys, $value);
  108. //功能同array_fill()函数.只不过这里用$arrKeys【一个数组的值】来做为新数组的键
  109. $arrKeys = array('45', 'd', 'b', 'c');
  110. printr(array_fill_keys($arrKeys, 'value'));
  111. echo '<br/><hr/><br/>';
  112. //---------------------------------------------
  113. //array_filter($arr, callBack回调函数)
  114. //过滤函数,通过对$arr数组的值的判断,如果 callBack回调函数 返回true,则将当前键以及值添加到新的数组里
  115. //TIP:回调函数可以写个规则,来过滤掉里边不符合规则的数组键
  116. function cb($val)
  117. {
  118. return $val%2 == 0;
  119. }
  120. $array = array('k1'=>3, 'k2'=>5,'k4'=>54654, 'k5'=>8794, 8945, 32549564);
  121. printr($array, 'cb');
  122. //tip:回调函数名建议用引号引起来
  123. //总结:该方法可以做成一个数据过滤的集成
  124. unset($array);
  125. echo '<br/><hr/><br/>';
  126. //---------------------------------------------
  127. //array_flip($array)
  128. //将数组中key和value的关系转换.只支持string和integr类型的键,其他类型将会发出警告,并且有问题的键值不转换.在生成的新的数组,如果键相同,他会不停的替换掉现有键的值
  129. $arr = array('k1'=>'v1', 'k2'=>'v2', 'k3'=>'v4', 'k4'=>'v4', 'k5'=>'v5');
  130. printr(array_flip($arr));
  131. unset($arr);
  132. echo '<br/><hr/><br/>';
  133. //---------------------------------------------
  134. //array_key_exists($key, $array)
  135. //判断一个键是否存在于当前数组中,返回bool.也可用来判断对象
  136. $array = array('cb' => 234, 'dv'=>45, 'one'=>897);
  137. if(array_key_exists('one', $array))
  138. echo '存在这个数组中';
  139. else
  140. echo '不存在';
  141. echo '<br/><hr/><br/>';
  142. //---------------------------------------------
  143. //array_keys($array, $selSearch_value)
  144. //返回数组中的键名并组成一个新数组,如果指定了$selSearch_value值,那么将返回数组里等于$selSearch_value的键名
  145. $array = getArr(4, 10);
  146. printr(array_keys($array));
  147. printr(array_keys($array, '5'));//带值的搜索
  148. unset($array);
  149. //总结:这个也可用于数据统计,数据对比验证
  150. echo '<br/><hr/><br/>';
  151. //---------------------------------------------
  152. echo 'array_map:';
  153. //array_map('callBack', $array,...)
  154. //把传入的函数,返回经callback回调函数的返回值
  155. //回调函数也可以返回一个数组.并且,回调函数只接受一个数组里的值传入
  156. function mapCb($n)
  157. {
  158. return $n*$n*$n;
  159. }
  160. $array = getArr(4, 15);
  161. printr(array_map('mapCb', $array));
  162. echo '<br/><hr/><br/>';
  163. //---------------------------------------------
  164. //array_merge($array,$array2...)
  165. //将多个数组组成一个数组,并对数字索引进行重新编写.
  166. $arr1 = getArr(1, 5);
  167. $arr2 = getArr(5, 10);
  168. printr(array_merge($arr1, $arr2));
  169. //总结:将多个数组组成一个新数组.
  170. echo '<br/><hr/><br/>';
  171. //---------------------------------------------
  172. //array_merge_recursive($arr1, $arr2....)
  173. //功能同上.但函数会将键名相同的值组成一个新数组,而不是替换掉
  174. //但如果要用,根据实际情况使用
  175. echo '<br/><hr/><br/>';
  176. //---------------------------------------------
  177. //array_multisort()
  178. //多维数组排序,目前只实现了二维数组排序.三维估计不能排
  179. //该函数会直接改变员数组顺序
  180. echo '<br/><hr/><br/>';
  181. //---------------------------------------------
  182. //array_pad($arr, $size, $value)
  183. //对数组进行填充,如果当前$arr的长度小于$size,那么,就用$value来填充$arr数组,直至$arr的长度与$size相等
  184. //如果$arr的长度大于或等于$size,那么该函数将不会对$arr进行填充. $size小于0则填充在$arr的左边,大于0则右边
  185. echo '<br/><hr/><br/>';
  186. //---------------------------------------------
  187. //array_pop($array)
  188. //去掉数组的最后一个键.
  189. echo '<br/><hr/><br/>';
  190. //---------------------------------------------
  191. //array_product($arr)
  192. //返回一个数组中所有数值的乘积.
  193. //tip:该函数无法处理非数值类型的数据.如果传入数组里包含‘a、b之类字符串',那么php会报错
  194. $arr = array(4,5,5);
  195. echo array_product($arr);
  196. echo '<br/><hr/><br/>';
  197. //---------------------------------------------
  198. //array_push($arr, $keyArr)
  199. //将$keyArr添加到$arr数组的末尾,以key/栈的形式添加.
  200. //与array_merge()、array_merge_recursive()两函数的区别:
  201. // arrap_push()是将一个$keyArr添加到$arr里边,而其他两个函数则是将多个函数连接成一个函数
  202. echo '<br/><hr/><br/>';
  203. //---------------------------------------------
  204. //array_rand($arr, $num=1)
  205. //取出当前数组里的键,取出几个由$num决定,默认为1
  206. //如果$num为1,那么它将返回一个string
  207. //如果$num>1 && $num<count($arr) 函数返回一个数组
  208. //否则php报错
  209. $arr = getArr(5, 15);
  210. printr(array_rand($arr, 4));
  211. echo '<br/><hr/><br/>';
  212. //---------------------------------------------
  213. //array_reduce()
  214. //和array_map()类似,通过回调函数,对数组里的数值进行处理,并接受返回值
  215. //该函数返回一个字符串.他会将数组里所有的值进行计算,并返回计算后的值,而array_map则是对每个键下的值进行计算,并返回array
  216. //不是太明白,实例看手册
  217. echo '<br/><hr/><br/>';
  218. //---------------------------------------------
  219. //array_replace($array, $parArr,...)
  220. //用参数数组里键的值替换掉$array里相同键的值
  221. //如果$array数组里在后边的参数数组里没有找到相应的键,那么添加到新数组后边
  222. /*$arr = getArr(4, 10);
  223. $arr2 = getArr(6, 15);
  224. printr($arr);
  225. printr($arr2);*/
  226. $base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
  227. $replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));
  228. printr(array_replace($base, $replacements));
  229. echo '<br/><hr/><br/>';
  230. //---------------------------------------------
  231. //array_replace_recursive() 递归替换
  232. //功能同array_replace()一样.区别在于:array_replace_recursive()可以对多维数组操作,并且不改变$array的结构,而array_replace()他最终会返回一个一维数组
  233. $base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
  234. $replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));
  235. printr(array_replace_recursive($base, $replacements));
  236. echo '<br/><hr/><br/>';
  237. //---------------------------------------------
  238. //array_reverse($arr)
  239. //将数组里的键按相反顺序排列
  240. echo '<br/><hr/><br/>';
  241. //---------------------------------------------
  242. //array_search($value, $array)
  243. //在$array数组中去找值为$value的键名
  244. //没有找到则返回false
  245. //如果$array数组鸿有多个$value,那么只返回第一个匹配的键
  246. //该函数与array_keys()类似,区别在于返回值上:array_search()只会返回一个匹配的键名,而array_keys()则可以返回一个由所有匹配的键组成的一维数组
  247. echo '<br/><hr/><br/>';
  248. //---------------------------------------------
  249. //array_shift($arr)
  250. //去掉当前$arr数组里的第一个键,并且对后边的数字索引进行重新编排(但不改变原有顺序),非数字索引不变.
  251. //该函数与array_pop()类似,区别在于array_pop()去掉是最后一个,array_shift()去掉脑袋
  252. echo '<br/><hr/><br/>';
  253. //---------------------------------------------
  254. //array_slice($arr, $offset, $length=0, false) 数组截取
  255. //返回当前$arr数组里从$offset处开始偏移,共$length个元素/键,并组成一个新数组返回
  256. //如果$offset或者$length为负数,那么就是向相反方向进行偏移
  257. //感觉和substring()字符串截取类似
  258. //直接用php手册上的实例了
  259. $input = array("a", "b", "c", "d", "e");
  260. $output = array_slice($input, 2); // returns "c", "d", and "e"
  261. $output = array_slice($input, -2, 1); // returns "d"
  262. $output = array_slice($input, 0, 3); // returns "a", "b", and "c"
  263. // note the differences in the array keys
  264. printr(array_slice($input, 2, -1));
  265. printr(array_slice($input, 2, -1, true));
  266. echo '<br/><hr/><br/>';
  267. //---------------------------------------------
  268. //array_spslice($arr, $offset, $length)
  269. //同array_slice()函数正好相反,该函数是去掉位于$offset和$length之间这些元素
  270. unset($arr);
  271. echo '<br/><hr/><br/>';
  272. //---------------------------------------------
  273. //array_sum($arr)
  274. //将$arr数组里的所有值进行求和累加,如果是非数值类型的则尝试进行转换,但是大部分转换后为0
  275. //该函数只会影响一层数组,和array_product()类似
  276. $arr = array(
  277. 45,56, 'a', 'b'=>getArr(1, 2),
  278. );
  279. printr($arr);
  280. echo 'array_sum($arr)',array_sum($arr);
  281. echo '<br/><hr/><br/>';
  282. //---------------------------------------------
  283. //array_values($arr)
  284. //将$arr数组里的值提取出来,组成新的数组
  285. $arr = array(
  286. 'k1'=>45,'k2'=>56, 'k3'=>'a', 'b'=>getArr(1, 2),
  287. );
  288. printr(array_values($arr));
  289. echo '<br/><hr/><br/>';
  290. //---------------------------------------------
  291. //array_unique($arr) 对数组进行排重
  292. //对$arr数组进行排重,将重复的值进行过滤.多个相同的值将只保留第一个
  293. echo '<br/><hr/><br/>';
  294. //---------------------------------------------
  295. //array_walk($arr, callback[回调函数], $sel_perfix='')
  296. //对当前数组下的每个键进送到 callback函数里进行处理
  297. //如果加上$sel_perfix参数,回调函数也要三个参数来接收,否则报错
  298. //该函数只影响一层
  299. $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
  300. function test_alter(&$item1, $key, $prefix)
  301. {
  302. $item1 = "$prefix: $item1";
  303. }
  304. printr(array_walk($fruits, 'test_print'));
  305. array_walk($fruits, 'test_alter', 'fruit');
  306. echo '<br/><hr/><br/>';
  307. //---------------------------------------------
  308. //array_walk_recursive()
  309. //功能类似于array_alk();但是他会递归$arr的每一层数组,返回的数组不会改变原有数组的结构
  310. echo '<br/><hr/><br/>';
  311. //---------------------------------------------
  312. //arsort($arr)
  313. //按照数组键名排序数组,可以对字母进行排序.如果排序失败,将返回null
  314. echo '<br/><hr/><br/>';
  315. //---------------------------------------------
  316. //asort()
  317. //功能类似于arsort(),区别在于:asort()是对值进行排序
  318. 数组循环
  319. 实例代码如下:
  320. foreach ($array as $value) {
  321. echo $value;
  322. }
  323. while (list($key) = each($array)) {
  324. echo $array[$key];
  325. }
  326. foreach ($array as $value) {
  327. echo $value;
  328. }
  329. while (list($key) = each($array)) {
  330. echo $array[$key];
  331. }

在循环里进行的是数组“写”操作,则while比foreach快:

实例代码如下:

  1. foreach ($array as $key => $value) {
  2. echo $array[$key] = $value . '...';
  3. }
  4. while (list($key) = each($array)) {
  5. $array[$key] = $array[$key] . '...';
  6. }
  7. foreach ($array as $key => $value) {
  8. echo $array[$key] = $value . '...';
  9. }
  10. while (list($key) = each($array)) {
  11. $array[$key] = $array[$key] . '...';
  12. }

总结:通常认为,foreach涉及到值复制,一定会比while慢,但实际上,如果仅仅是在循环里进行数组的读操作,那么foreach是很快的,这是因为PHP采用的复制机制是“引用复制,写时拷贝”,这样看来,foreach的高效读操作就不难理解了.

另外,既然foreach不适合处理数组写操作,那么我们可以得出一个结论,多数情况下,类似foreach ($array as $key => $value)形式的代码都应该被替换成while (list($key) = each($array)).