1 <?php 2 /** 3 * File: phpstudy : array_test.php 4 * Created by PhpStorm. 5 * User: IhMfLy [email protected] 6 * Date: 2016-08-03 7 * Time: 10:36 8 */ 9 24 25 26 # 创建数组 27 $arr1_0 = array(); 28 $arr1_0[] = 23; #创建,再初始化 29 $arr1_0[] = "lisi"; 30 $arr1_1 = array("name"=>"zhangs","age"=>18,15835982612); #创建的同时并初始化 31 32 print_r($arr1_0); 33 print_r($arr1_1); 34 35 #5.4之后支持另外一种写法来创建数组 36 $arr2 = [ 37 "name"=>"wangwu", 38 18, 39 12456625554 40 ]; 41 echo "Current PHP Version : " . PHP_VERSION . "\n"; 42 print_r($arr2); 43 44 #数组的拷贝 45 $arr3 = &$arr2 ; 46 $arr3[] = "only exist in $arr3";#$arr3的更改不影响$arr2 47 print_r($arr2); 48 print_r(arr3); 49 50 51 # 数组基本crud操作 52 53 #create 增加元素 54 $arr1_0[] = "IhMfLy"; 55 $arr1_0["pheonix"] = "hkbxoic"; 56 array_push($arr1_1,"pushone"); 57 58 print_r($arr1_0); 59 print_r($arr1_1); 60 61 # array_unshift(); # 添加新元素到数组头部 62 # array_shift(); # 移除数组头部元素 63 # array_pad(); # 数组首尾选择性追加 64 65 # retrieve 检索 66 # 使用下标 或 key 来获取 67 68 # update 更新 69 #使用下标直接更改值 70 71 # delete 删除 72 #unset 73 /* 74 //unset()的使用 75 $num = array_fill(0,5,rand(1,10));//rand(min,max) 76 print_r($num);//Array ( [0] => 8 [1] => 8 [2] => 8 [3] => 8 [4] => 8 ) 77 echo ‘ 78 ‘; 79 80 unset($num[3]); 81 print_r($num);//Array ( [0] => 8 [1] => 8 [2] => 8 [4] => 8 ) 82 */ 83 #array_splice() 84 $num = [10,20,30,40,50,60,70,80]; 85 print_r(array_splice($num,1,2));//被删除的元素数组 86 print_r($num); //删除后的元素数组 87 88 # array_pop() 89 90 # 数组统计 91 # 统计数组元素个数 92 echo count($arr2); 93 echo sizeof($arr2); 94 # 统计值出现的次数 95 $num = [10,20,30,10,20,1,0,10]; 96 print_r(array_count_values($num)); 97 98 # 数组排序 99 #正向排序:sort(),asort(),ksort(); 100 #逆向排序:rsort(),arsort(),krsort(); 101 102 103 # 数组指针操作 104 /* 105 //current(pos)的使用 106 echo current($array);//z;获取当前数组中的当前单元 107 108 //next的使用 109 echo next($array);//a;将数组中的内部指针向前移动一位 110 111 //reset的使用 112 echo reset($array);//z;将数组内部指针指向第一个单元 113 114 //prev的使用 115 echo next($array);//a; 116 echo prev($array);//z;倒回一位 117 */ 118 119 120 # array_search() 搜索数值 121 # array_flip() 交换键值 122 # array_fill()的使用 123 $num = range(‘a‘,‘e‘); 124 $arrayFilled = array_fill(1,2,$num);//array_fill(start,number,value) 125 # list() 将数组中的值赋给某些变量 126 # unset($num); 清空数组 print_r($num); 127 128 129 # array_unique删除数组中的重复值:
收集的数组操作:大全(转自:http://blog.csdn.net/luckily01/article/details/7719573)
1 一、数组操作的基本函数 2 数组的键名和值 3 array_values($arr);获得数组的值 4 array_keys($arr);获得数组的键名 5 array_flip($arr);数组中的值与键名互换(如果有重复前面的会被后面的覆盖) 6 in_array("apple",$arr);在数组中检索apple 7 array_search("apple",$arr);在数组中检索apple ,如果存在返回键名 8 array_key_exists("apple",$arr);检索给定的键名是否存在数组中 9 isset($arr[apple]):检索给定的键名是否存在数组中 10 11 数组的内部指针 12 current($arr);返回数组中的当前单元 13 pos($arr);返回数组中的当前单元 14 key($arr);返回数组中当前单元的键名 15 prev($arr);将数组中的内部指针倒回一位 16 next($arr);将数组中的内部指针向前移动一位 17 end($arr);将数组中的内部指针指向最后一个单元 18 reset($arr;将数组中的内部指针指向第一个单元 19 each($arr);将返回数组当前元素的一个键名/值的构造数组,并使数组指针向前移动一位 20 list($key,$value)=each($arr);获得数组当前元素的键名和值 21 22 数组和变量之间的转换 23 extract($arr);用于把数组中的元素转换成变量导入到当前文件中,键名当作变量名,值作为变量值 24 注:(第二个参数很重要,可以看手册使用)使用方法 echo $a; 25 compact(var1,var2,var3);用给定的变量名创建一个数组 26 27 二、数组的分段和填充 28 数组的分段 29 array_slice($arr,0,3);可以将数组中的一段取出,此函数忽略键名 30 array_splice($arr,0,3,array("black","maroon"));可以将数组中的一段取出,与上个函数不同在于返回的序列从原数组中删除 31 32 分割多个数组 33 array_chunk($arr,3,TRUE);可以将一个数组分割成多个,TRUE为保留原数组的键名 34 35 数组的填充 36 array_pad($arr,5,‘x‘);将一个数组填补到制定长度 37 38 三、数组与栈 39 array_push($arr,"apple","pear");将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数 40 array_pop($arr);将数组栈的最后一个元素弹出(出栈) 41 42 四、数组与列队 43 array_shift($arr);数组中的第一个元素移出并作为结果返回(数组长度减1,其他元素向前移动一位,数字键名改为从零技术,文字键名不变) 44 array_unshift($arr,"a",array(1,2));在数组的开头插入一个或多个元素 45 46 五、回调函数 47 array_walk($arr,‘function‘,‘words‘);使用用户函数对数组中的每个成员进行处理(第三个参数传递给回调函数function) 48 array_mpa("function",$arr1,$arr2);可以处理多个数组(当使用两个或更多数组时,他们的长度应该相同) 49 array_filter($arr,"function");使用回调函数过滤数组中的每个元素,如果回调函数为TRUE,数组的当前元素会被包含在返回的结果数组中,数组的键名保留不变 50 array_reduce($arr,"function","*");转化为单值函数(*为数组的第一个值) 51 52 六、数组的排序 53 通过元素值对数组排序 54 sort($arr);由小到大的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序 55 rsort($arr);由大到小的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序 56 usort($arr,"function");使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)忽略键名的数组排序 57 asort($arr);由小到大的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序 58 arsort($arr);由大到小的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序 59 uasort($arr,"function");使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)保留键名的数组排序 60 61 通过键名对数组排序 62 ksort($arr);按照键名正序排序 63 krsort($arr);按照键名逆序排序 64 uksort($arr,"function");使用用户自定义的比较函数对数组中的键名进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个) 65 66 自然排序法排序 67 natsort($arr);自然排序(忽略键名) 68 natcasesort($arr);自然排序(忽略大小写,忽略键名) 69 70 七、数组的计算 71 数组元素的求和 72 array_sum($arr);对数组内部的所有元素做求和运算 73 74 数组的合并 75 array_merge($arr1,$arr2);合并两个或多个数组(相同的字符串键名,后面的覆盖前面的,相同的数字键名,后面的不会做覆盖操作,而是附加到后面) 76 “+”$arr1+$arr2;对于相同的键名只保留后一个 77 array_merge_recursive($arr1,$arr2); 递归合并操作,如果数组中有相同的字符串键名,这些值将被合并到一个数组中去。如果一个值本身是一个数组,将按照相应的键名把它合并为另一个数组。当数组 具有相同的数组键名时,后一个值将不会覆盖原来的值,而是附加到后面 78 79 数组的差集 80 array_diff($arr1,$arr2);返回差集结果数组 81 array_diff_assoc($arr1,$arr2,$arr3);返回差集结果数组,键名也做比较 82 83 数组的交集 84 array_intersect($arr1,$arr2);返回交集结果数组 85 array_intersect_assoc($arr1,$arr2);返回交集结果数组,键名也做比较 86 87 八、其他的数组函数 88 range(0,12);创建一个包含指定范围单元的数组 89 array_unique($arr);移除数组中重复的值,新的数组中会保留原始的键名 90 array_reverse($arr,TRUE);返回一个单元顺序与原数组相反的数组,如果第二个参数为TRUE保留原来的键名 91 //srand((float)microtime()*10000000); 随机种子触发器 92 array_rand($arr,2);从数组中随机取出一个或 多个元素 93 shuffle($arr);将数组的顺序打乱 94 本类函数允许用多种方法来操作数组和与之交互。数组的本质是储存,管理和操作一组变量。 95 PHP 支持一维和多维数组,可以是用户创建或由另一个函数创建。有一些特定的数据库处理函数可以从数据库查询中生成数组,还有一些函数返回数组。 96 97 array_change_key_case — 返回字符串键名全为小写或大写的数组 98 array_chunk — 将一个数组分割成多个 99 array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 100 array_count_values — 统计数组中所有的值出现的次数 101 array_diff_assoc — 带索引检查计算数组的差集 102 array_diff_key — 使用键名比较计算数组的差集 103 array_diff_uassoc — 用用户提供的回调函数做索引检查来计算数组的差集 104 array_diff_ukey — 用回调函数对键名比较计算数组的差集 105 array_diff — 计算数组的差集 106 array_fill_keys — Fill an array with values, specifying keys 107 array_fill — 用给定的值填充数组 108 array_filter — 用回调函数过滤数组中的单元 109 array_flip — 交换数组中的键和值 110 array_intersect_assoc — 带索引检查计算数组的交集 111 array_intersect_key — 使用键名比较计算数组的交集 112 array_intersect_uassoc — 带索引检查计算数组的交集,用回调函数比较索引 113 array_intersect_ukey — 用回调函数比较键名来计算数组的交集 114 array_intersect — 计算数组的交集 115 array_key_exists — 检查给定的键名或索引是否存在于数组中 116 array_keys — 返回数组中所有的键名 117 array_map — 将回调函数作用到给定数组的单元上 118 array_merge_recursive — 递归地合并一个或多个数组 119 array_merge — 合并一个或多个数组 120 array_multisort — 对多个数组或多维数组进行排序 121 array_pad — 用值将数组填补到指定长度 122 array_pop — 将数组最后一个单元弹出(出栈) 123 array_product — 计算数组中所有值的乘积 124 array_push — 将一个或多个单元压入数组的末尾(入栈) 125 array_rand — 从数组中随机取出一个或多个单元 126 array_reduce — 用回调函数迭代地将数组简化为单一的值 127 array_reverse — 返回一个单元顺序相反的数组 128 array_search — 在数组中搜索给定的值,如果成功则返回相应的键名 129 array_shift — 将数组开头的单元移出数组 130 array_slice — 从数组中取出一段 131 array_splice — 把数组中的一部分去掉并用其它值取代 132 array_sum — 计算数组中所有值的和 133 array_udiff_assoc — 带索引检查计算数组的差集,用回调函数比较数据 134 array_udiff_uassoc — 带索引检查计算数组的差集,用回调函数比较数据和索引 135 array_udiff — 用回调函数比较数据来计算数组的差集 136 array_uintersect_assoc — 带索引检查计算数组的交集,用回调函数比较数据 137 array_uintersect_uassoc — 带索引检查计算数组的交集,用回调函数比较数据和索引 138 array_uintersect — 计算数组的交集,用回调函数比较数据 139 array_unique — 移除数组中重复的值 140 array_unshift — 在数组开头插入一个或多个单元 141 array_values — 返回数组中所有的值 142 array_walk_recursive — 对数组中的每个成员递归地应用用户函数 143 array_walk — 对数组中的每个成员应用用户函数 144 array — 新建一个数组 145 arsort — 对数组进行逆向排序并保持索引关系 146 asort — 对数组进行排序并保持索引关系 147 compact — 建立一个数组,包括变量名和它们的值 148 count — 计算数组中的单元数目或对象中的属性个数 149 current — 返回数组中的当前单元 150 each — 返回数组中当前的键/值对并将数组指针向前移动一步 151 end — 将数组的内部指针指向最后一个单元 152 extract — 从数组中将变量导入到当前的符号表 153 in_array — 检查数组中是否存在某个值 154 key — 从关联数组中取得键名 155 krsort — 对数组按照键名逆向排序 156 ksort — 对数组按照键名排序 157 list — 把数组中的值赋给一些变量 158 natcasesort — 用“自然排序”算法对数组进行不区分大小写字母的排序 159 natsort — 用“自然排序”算法对数组排序 160 next — 将数组中的内部指针向前移动一位 161 pos — current() 的别名 162 prev — 将数组的内部指针倒回一位 163 range — 建立一个包含指定范围单元的数组 164 reset — 将数组的内部指针指向第一个单元 165 rsort — 对数组逆向排序 166 shuffle — 将数组打乱 167 sizeof — count() 的别名 168 sort — 对数组排序 169 uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 170 uksort — 使用用户自定义的比较函数对数组中的键名进行排序 171 usort — 使用用户自定义的比较函数对数组中的值进行排序 172 使用数组 173 在前面的章节中,我们所介绍的变量都是标量变量,这些变量只能存储单个数据。数组是一个可以存储一组或一系列数值的变量。一个数组可以具有许多个元素。每个元素有一个值,例如文本、数字或另一个数组。一个包含其他数组的数组称为多维数组。 174 175 3.1 什么是数组 176 一个标量变量就是一个用来存储数值的命名区域。同样,一个数组就是一个用来存储一系列变量值的命名区域,因此,可以使用数组组织标量变量。 177 存储在数组中的值称为数组元素。每个数组元素有一个相关的索引(也称为关键字),它可以用来访问元素。在大多数编程语言中,数组都具有数字索引,而且这些索个通常是从0或1开始的。 178 179 3.2 数字索引数组 180 在PHP中,数字索引的默认值是从0开始的,当然也可以改变它。 181 182 3.2.1 数字索引数组的初始化 183 $porducts = array( ‘Tires‘, ‘Oil‘, ‘Spark Plugs‘ ); 184 就像echo语句一样,array()实际上是一个语言结构,而不是一个函数。 185 根据对数组内容的需求不同,可能不需要再像以上例子一样对它们进行手工的初始化操作。如果所需数据保存在另一个数组中,可以使用运算符“=”简单地将数组复制到另一个数组。 186 如果需要将按升序排列的数字保存在一个数组中,可以使用range()函数自动创建这个数组。如下这行代码将创建一个从1到10的数字数组:$numbers = range(1,10); 187 range()函数具有一个可选的第三个参数,这个参数允许设定值之间的步骤。例如,如需建立一个1到10之间的奇数数组,可以使用如下代码:$odds = range(1,10,2); 188 range()函数也可以对字符进行操作,如:$letters = range(‘a‘, ‘z‘); 189 190 3.2.2 访问数组的内容 191 要访问一个变量的内容,可以直接使用其名称。如果该变量是一个数组,可以使用变量名称和关键字或索引的组合来访问其内容。关键字或索引将指定我们要访问的变量。索引在变量名称后面用方括号括起来。 192 在默认的情况下,0元素是数组的第一个元素。 193 请注意,虽然PHP的字符串解析功能非常强大和智能,但是可能会引起混淆。当你将数组或其他变量嵌入双引号中的字符串时,如果不能正确解释它们,可以将它们放置在双引号之外,或者查找第4章的“字符串操作与正则表达式”获得更复杂的语法。 194 就像PHP的其他变量一样,数组不需要预先初始化或创建。在第一次使用它们的时候,它们会自动创建。 195 196 3.2.3. 使用循环访问数组 197 由于数组使用有序的数字作为索引,所以使用一个for循环就可以很容易地显示数组的内容。 198 for ($i=0; $i<3; $i++) 199 echo "$products[$i]"; 200 使用一个简单的循环就可以访问每个元素是数字索引数组的一个非常好的特性。也可以使用foreach循环,这个循环语句是专门为数组而设计的。如: 201 foreach ($products as $current) 202 echo $current. ‘ ‘; 203 204 3.3 使用不同索引的数组 205 PHP还支持相关数组。在相关数组中,可以将每个变量值与任何关键字或索引关联起来。 206 207 3.3.1 初始化相关数组 208 如下所示的代码可以创建一个以产品名称作为关键字、以价格作为值的相关数组: 209 $prices = array( ‘Tires‘=>100, ‘Oil‘=>10, ‘Spark Plugs‘=>4 ); 210 关键字和值之间的符号只是一个大于号与等于符号。 211 212 3.3.2 访问数组元素 213 同样,可以使用变量名称和关键字来访问数组的内容。例如$prices[‘Tires‘]。 214 215 3.3.3 使用循环语句 216 因为相关数组的索引不是数字,因此无法在for循环语句中使用一个简单的计数器对数组进行操作。但是可以使用foreach循环或list()和each()结构。 217 当使用foreach循环语句对相关数组进行操作时,foreach()循环具有不同的结构。可以按如下方式使用关键字: 218 foreach ($prices as $key => $value) 219 echo $key.‘=>‘.$value.‘<br />‘; 220 如下所示的代码将使用each()结构打印$prices数组的内容: 221 while( $element = each($prices)) 222 { 223 echo $element[‘key‘]; 224 echo ‘ - ‘; 225 echo $element[‘value‘]; 226 echo ‘<br />‘; 227 } 228 each()函数将返回数组的当前元素,并将下一个元素作为当前元素。因为在while循环中调用each()函数,它将按顺序返回数组中每个元素,并且当它到达数组末尾时,循环操作将终止。 229 在 这段代码中,变量$element是一个数组。当调用each()时,它将返回一个带有4个数值和4个指向数组位置的索引的数组。位置key和0包含了当 前元素的关键字,而位置value和1包含了当前元素的值。虽然这与选哪一种方法没什么不同,但我们选择了使用命名位置,而不是数字索引位置。 230 此外,还有一种更为高级和常见的方式来完成相同的操作。函数list()可以用来将一个数组分解为一系列的值。可以按照如下方式将函数each()返回的两个值分开:list( $product, $price) = each( $price); 231 以上代码使用each()从$prices数组中取出当前元素,并且将它作为数组返回,然后再指向下一个元素。它还使用list()将从each()返回的数组中所包含0、1两个元素变为两个名为$product和$price的新蛮量。 232 我们可以循环遍历整个$prices数组,使用如下所示的简短脚本显示它的内容: 233 while(list($prodct, $pirce) = each($prices)) 234 echo "$product - $price<br />"; 235 这段代码的输出结果与前面脚本的输出结果相同,但它更容易阅读,因为list()允许为新变量命名。 236 需要注意的一点是,当使用each()函数时,数组将记录当前元素。如果希望在相同的脚本中两次使用该数组,就必须使用函数reset()将当前元素重新设置到数组开始处。要再次遍历prices数组,可以使用如下所示的代码: 237 reset($prices); 238 while(list($product, $price) = each($prices)) 239 echo "$product - $price<br />"; 240 241 3.4 数组操作符 242 +联合,==等价,===恒等,!=不等价,<>不等价,!==不恒等。 243 联合操作符尝试将$b中的元素添加到$a的末尾。如果$b中的元素与$a中的一些元素具有相同的索引,它们将不会被添加。即$a中的元素将不会被覆盖。 244 245 3.5 多维数组 246 数组不一定就是一个关键字和值的简单列表——数组中的每个位置还可以保存另一个数组。使用这种方法,可以创建一个二维数组。可以把二维数组当成一个矩阵,或者是一个具有宽度和高度或者行和列的网络。 247 248 3.6 数组排序 249 250 3.6.1 使用sort()函数 251 sort()函数是区分字母大小写的。所有的大家字母都在小写字母的前面。所以‘A’小于‘Z’,而‘Z‘小于‘a’。 252 该 函数的第二个参数是可选的。这个可选参数可以传递SORT_REGULAR(默认值)、SORT_NUMERIC或SORT_STRING。指定排序类型 的功能是非常有用的,例如,当要比较可能包含有数字2和12的字符串时。从数学角度看,2要小于12,但是作为字符串,‘12’却要小于‘2’。 253 254 3.6.2 使用asort()函数和ksort()函数对相关数组排序 255 函数asort()根据数组的每个元素值进行排序。ksort()函数是按关键字排序而不是按值排序。 256 257 3.6.3 反向排序 258 函数rsort()将一个一维数字索引数组按降序排序。函数arsort()将一个一维相关数组按每个元素值的降序排序。函数krsort()针根据数组元素的关键字将一维数组按照降序排序。 259 为了访问一个一维数组中的数据,需要使用数组的名称和元素的索引,除了一个元素具有两个索引——行和列外,二维数组和一维数组是类似的。 260 可以使用双重for循环来实现同样的效果: 261 for ( $row=0; $row<3; $row++ ) 262 { 263 for ( $column=0; $column<3; $column++ ) 264 { 265 echo ‘|‘.$products[$row][$column]; 266 | 267 echo ‘|<br />‘; 268 } 269 如果对一个大数组使用这种代码,那么将简洁得多。 270 你可能更喜欢创建列名称来代替数字。可以使用如下代码: 271 $products = array ( array ( ‘Code‘=>‘TIR‘, ‘Descrīption‘=>‘Tires‘, ‘Price‘=>100 ), array ( ‘Code‘=>‘OIL‘, ‘Descrīption‘=>‘Oil‘, ‘Price‘=>10 ), array ( ‘Code‘=>‘SPK‘, ‘Descrīption‘=>‘Spark Plugs‘, ‘Price‘=>4 ) }; 272 如果希望检索单个值,那么使用这个数组会容易得多。请记住,将所描述的内容保存到用它的名 称命名的列中,与将其保存到所谓的第一列中相比,前者更容易记忆。使用描述性索引,不需要记住某个元素是存放在[x][y]位置的。使用一对有意义的行和 列的名称作为索引可以使用你很容易找到所需的数据。 273 然后,我们却不能使用一个简单的for循环按顺序遍历每一列。可以使用for循环遍历外部的数 字索引数组$products。$products数组的每一行都是一个具有描述性索引的数组。在while循环中使用each()和list()函数, 可以遍历整个内部数组。因此,需要一个内嵌有while循环的for循环。 274 for ( $row = 0; $row < 3; $row++ } 275 { 276 while ( list ( $key, $value ) = each ( $products[$row] ) ) 277 { 278 echo "|$value"; 279 } 280 echo ‘|<br />‘; 281 } 282 三维数组具有高、宽、深的概念。如果能轻松地将一个二维数组想像成一个有行和列的表格,那么就可以将三维数组想像成一堆像这样的表格。每个元素可以通过层、行和列进行引用。 283 根据创建多维数组的方法,可以创建四维、五维或六维数组。在PHP中,并没有设置数组维数的限制,但人们很难设想一个多于三维的数组。大多数的实际问题在逻辑上只需要使用三维或者更少维的数组结构就可以了。 284 285 3.7 多维数组的排序 286 对 多于一维的数组进行排序,或者不按字母和数字的顺序进行排,要复杂得多。PHP知道如何比较两个数字或字符串,但在多维数组中,每个元素都是一个数组。 PHP不知道如何比较两个数组,所以需要建立一个比较它们的方法。在大多数情况下,单词和数字的顺序是显而易见的——但对于复杂的对象,问题就会多一些。 287 288 3.7.1 用户定义排序 289 usort()中的“u”代表“user”,因为这个函数要求传入用户定义的比较函数。asort和ksort对应的版本uasort()和uksort()也要求传入用户定义的比较函数。 290 类似于asort(),当对非数字索引数组的值进行排序时,uasort()才会被使用。如果值是简单的数字或文本则可以使用asort。如果要比较的值像数组一样复杂,可以定义一个比较函数,然后使用uasort()。 291 类似于ksort(),当对非数字索引数组的关键字进行排序时才使用uksort()。如果值是简单的数字或文本就使用ksort。如果要比较的对象像数组一样复杂,可以定义一个比较函数,然后使用uksort()。 292 293 3.7.2 反向用户排序 294 函数sort()、asort()和ksort()都分别对应一个带字母“r”的反向排序函数。用户定义的排序没有反向变体,但可以对一个多维数组进行反向排序。 295 296 3.8 对数组进行重新排序 297 298 3.8.1 使用shuffle()函数 299 在PHP的早期版本中,shuffle()要求调用srand()函数时首先提供一个随机数生成器。如今,这个步骤已经不再需要了。 300 如果这个函数对你非常重要,可以在程序中应用该函数之前在服务器上测试它。 301 由于并不需要真正重新排序整个数组,使用array_rand()函数可以实现相同的功能。 302 303 3.8.2 使用array_reverse()函数 304 array_reverse()函数使用一个数组作参数,返回一个内容与参数数组相同但顺序相反的数组。 305 因为单独使用range()函数将创建一个升序序列,所以必须使用sort()函数或array_reverse()函数将数组中的数字变为降序。或者,也可以使用for循环通过一次一个元素的方式创建这个数组。如: 306 $numbers = array(); 307 for ($i=10; $i>0; $i--) 308 array_push( $numbers, $i ); 309 一个for循环可以像这样按降序方式运行。可以将计数器 310 一个for循环可以像这样按降序方式运行。可以将计数器的初始值设为一个大数,在每次循环末尾使用运算符“--”将计数器减1。 311 在这里,我们创建了一个空数组,然后使用array_push()函数将每个新元素添加到数组的末尾。请注意,和array_push()相反的函数是array_pop(),这个函数用来删除并返回数组末尾的一个元素。 312 或者,也可以使用array_reverse()函数将由range()函数所创建的数组进行反向排序。 313 请注意,array_reverse()函数将返回一个原数组修改后的副本。如果不再需要原来的数组,比如在这个例子中,可以用新的副本覆盖原来的版本。 314 如果数据只是一系列的整数,可以通过将-1作为range()函数的第三个可选调参数,以相反的顺序创建该数组。 315 316 3.9 从文件载入数组 317 使用file()函数将整个文件载入一个数组中。文件中的每行则成为数组中的一个元素。使用了count()函数来统计数组中的元素个数。 318 explode("\t", $orders[$i]) 319 explode()函数可以将传入的字符串分割成一个个小块。每个制表符成为两个元素之间的断点。这个函数的可选参数limit可以用来限制被返回的最大块数。 320 可以使用许多方法从字符串中提取数字。在这里,我们使用了intval()函数。它可以将一个字符串转化成一个整数。这个转换是相当智能化的,它可以忽略某些部分,例如标签就不能转换成数字。 321 322 3.10 执行其他的数组操作 323 324 3.10.1 在数组中浏览:each()、current()、reset()、end()、next()、pos()和prev() 325 前面已经提到,每个数组都有一个内部指针指向数组中的当前元素。当使用函数each()时,就间接地使用了这个指针,但是也可以直接使用和操作这个指针。 326 如果创建一个新数组,那么当前指针就将被初始化,并指向数组的第一个元素。 327 调用next()或each()将使指针前移一个元素。调用each($array_name)会在指针前移一个位置之前返回当前元素。next()函数则有些不同——调用next($array_name)是将指针前移,然后再返回新的当前元素。 328 调用end($array_name)可以将指针移到数组末尾。 329 要反向遍历一个数组,可以使用end()和prev()函数。prev()函数和next()函数相反。它是将当前指针往回移一个位置然后再返回新的当前元素。 330 331 3.10.2 对数组的每一个元素应用任何函数:array_walk() 332 array_walk()函数需要三个参数。第一个是arr,也就是需要处理的数组。第二个是func,也就是用户自定义并将作用于数组中每个元素的函数。第三个参数userdata是可选的,如果使用它,它可以作为一个参数传递给我们自己的函数。 333 看一个销微复杂点的例子: 334 function my_multiply(&$value, $key, $factor) 335 { 336 $value *= $factor; 337 } 338 array_walk(&$array, ‘my_multiply‘, 3); 339 在这里,我们定义了一个名为my_multiply()的函数,它可以用所提供的乘法因子去乘以数组中的每个元素。 340 此外,还有一个需要注意的问题是传递毵数$value的方式。在my_multiply()的函数定义中,变量前面的地址符(&)意味着$value是按引用方式传递的。按引用方式传递允许函数修改数组的内容。 341 342 3.10.3 统计数组元素个数:count()、sizeof()和array_count_values() 343 count()函数和sizeof()函数具有同样的用途,都可以返回数组元素的个数。可以得到一个常规标量变量中的元素个数,如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组个数就是0。 344 如 果调用array_count_values($array),这个函数将会统计每个特定的值在数组$array中出现过的次数(这就是数组的基数集)。 这个函数将返回一个包含频率表的相关数组。这个数组包含数组$array中的所有值,并以这些值作为相关数组的关键字。每个关键字所对应的数值就是关键字 在数组$array中出现的次数。 345 346 3.10.4 将数组转换成标量变量:extract() 347 对于一个非数字索引数组,而该数组又有许多关键字-值对,可以使用函数extract()将它们转换成一系列的标量变量。 348 函数extract()的作用是通过一个数组创建一系列的标量变量,这些变量的名称必须是数组中关键字的名称,而变量值则是数组中的值。 349 extract()函数具有两个可选参数:extract_type和prefix。变量extract_type将告诉extract()函数如何处理冲突。有时可能已经存在一个和数组关键字同名的变量,该函数的默认操作是覆盖已有的变量。 350 两个最常用的选项是EXTR_OVERWRITE(默认值)和EXTR_PREFIX_ALL。当知道会发生特定的冲突并且希望跳过该关键字或要给它加上前缀时,可能会用到其他选项。 351 extract()可以提取出一个元素,该元素的关键字必须是一个有效的变量名称,这就意味着以数字开始或包含空格的关键字将被跳过。
时间: 2024-11-20 07:23:43