PHP学习(4)——数组的使用
1.数组的概念
数组就是一个用来存储一系列变量值的命名区域。
每个数组元素有一个相关的索引(也成为关键字),它可以用来访问元素。
PHP允许间隔性地使用数字或字符串作为数组的索引。
2.数字索引数组
2.1 数字索引数组的初始化
$products = array(‘Tires’,’Oil’,’Spark Plugs’);
如果需要将按升序排列的数字保存在一个数组中,可以使用range()函数自动创建这个数组。
创建一个1-10的数字数组:
$numbers = range(1,10);
可选的第三个参数允许设定值之间的步幅。
创建一个1-10之间的奇数数组:
$odds = range(1,10,2);
2.2 访问数组的内容
默认情况下,0元素是数组的第一个元素,使用$products[0]、$products[1]、$products[2],就可以使用数组$products的内容了。
除了访问,数组的内容可以修改和添加:
$products[3] = ‘Fuses’;
像PHP的其他变量一样,数组不需要预先初始化或创建。在第一次使用它们的时候,它们会自动创建。
如下代码创建了一个与前面使用array()语句创建的$products数组相同的数组:
$products[0] = ‘Tires’; $products[1] = ‘Oil’; $products[2] = ‘Spark Plugs’;
数组的大小将根据所增加的元素多少动态地变化。
2.3 使用循环访问数组
就是遍历数组:
foreach($products as $current){ echo $current.” “; }
以上代码将依次保存$current变量中的每一个元素并且打印它们。
3.使用不同索引的数组
在上面的$products数组中,允许PHP为每个元素指定一个默认的索引。这就意味着,所添加的第一个元素为元素0,第二个元素为1等。PHP还支持关联数组。
3.1 初始化关联数组
如下所示的代码可以创建一个以产品名称为关键字、以价格作为值的关联数组:
$prices = array(‘Tires’=>100,’Oil’=>10,’Spark Plugs’=>4);
3.2 使用循环语句
因为关联数组的索引不是数字,因此无法使用for循环语句对数组进行操作。但是可以使用foreach循环或list()和each()结构。
当使用foreach循环语句对关联数组进行操作时,可以按如下方式使用关键字:
foreach($prices as $key => $value){ echo $key.” - ”.$value.”<br />”; }
如下所示的代码将使用each()结构打印$prices数组的内容。
while($element = each($prices)){ echo $element[‘key’]; echo “ - ”; echo $element[‘value’]; echo “<br />”; }
在这段代码中,变量$element是一个数组。当调用each()时,它将返回一个带有4个数值和4个指向数组位置的索引的数组。位置key和0包含了当前元素的关键字,而位置value和1包含了当前元素的值。
除了以上两种方式,函数list()可以用来将一个数组分解为一系列的值。
while(list($product,$price) = each($prices)){ echo “$product - $price<br />”; }
这个看起来挺高大上,使用each()从$prices数组中取出当前元素,并且将它作为数组返回,然后再指向下一个元素。还使用list()将从each()返回的数组中所包含0、1两个元素变为两个名为$product和$price的新变量。
三种输出方式的结果相同:
注意,当使用each()函数时,数组将记录当前元素。如果希望在相同的脚本中两次使用该数组,就必须使用函数reset()将当前元素重新设置到数组开始处。要再次遍历该数组,可以使用以下代码:
reset($prices); while( list( $product, $price ) = each( $prices )) echo “$product - $price<br />”;
以上代码可以将当前元素重新设置到数组开始处,因此允许再次遍历数组。
4.数组操作符
其中联合操作符(+)尝试将$b中的元素添加到$a的末尾。如果$b中的元素与$a中的一些元素具有相同的索引,它们将不会被添加。即$a中的元素将不会被覆盖。
5.多维数组
5.1 二维数组
$products = array( array( ‘TIR’, ‘Tires’, 100 ), array( ‘OIL’, ‘Oil’, 10 ), array( ‘SPK’, ‘Spark Plugs’, 4 ));
可以使用双重for循环来访问每个元素:
for($row = 0; $row < 3; $row++){ for($column = 0; $column < 3; $column++){ echo ‘|’.$products[$row][$column]; } echo ‘|<br />’; }
可以使用列名称来代替数字。要保存产品的相同集合,可以使用如下代码:
$products = array( array( ‘Code’=>’TIR’, ‘Description’=>’Tires’, ‘Price’=>100 ), array( ‘Code’=> ‘OIL’, ‘Description’=>’Oil’, ‘Price’=>10 ), array(‘Code’=>’SPK’, ‘Decription’=>’Spark Plugs’, ‘Price’=>4 ) );
如果希望检索单个值,那么使用这个数组会容易得多。 使用描述性索引,不需要记住某个元素是存放在[x][y]位置的。使用一对有意义的行和列的名称作为索引可以使你很容易找到所需的数据。
描述性索引的遍历:
for( $row = 0; $row < 3; $row++ ){ while( list( $key, $value ) =each( $products[$row] ) ){ echo “|$value”; } echo ‘|<br />’; }
5.2 三维数组
三维数组是一个包含了数组的数组的数组。
$categories = array( array( array('CAR_TIR','Tires',100), array('CAR_OIL','Oil',10), array('CAR_SPK','Spark Plugs',4) ), array( array('VAN_TIR','Tires',120), array('VAN_OIL','Oil',12), array('VAN_SPK','Spark Plugs',5) ), array( array('TRK_TIR','Tires',150), array('TRK_OLL','Oil',15), array('TRK_SPK','Spark Plugs',6) ) );
遍历:
for($layer = 0;$layer < 3;$layer++){ echo "Layer $layer<br />"; for($row = 0;$row < 3;$row++){ for($column = 0;$column < 3;$column++){ echo '|'.$categories[$layer][$row][$column]; } echo '|<br />'; } }
根据创建多维数组的方法,可以创建四维、五维或六维数组。感兴趣可以试下。
6.数组排序
6.1 使用sort()函数
sort()函数可以将数组按字母升序进行排序:
$products = array('LiLei','HanMeimei','Wo'); sort($products); foreach ($products as $key) { echo $key." "; }
还可以按数字顺序进行排序。需要注意的是,sort()函数是区分大小写的。所有大写字母都在小写字母前面。
第二个参数可选,可指定排序类型:SORT_REGULAR(默认值)、SORT_NUMERIC或SORT_STRING。
6.2 使用asort()函数和ksort()函数对关联数组排序
如果用关联数组存储各个项目和它们的价格,就需要用不同的排序函数使关键字和值在排序时仍然保持一致。
如下创建一个包含3个产品和价格的数组:
$prices = array('Tires'=>100,'Oil'=>10,'Spark Plugs'=>4);
函数asort()根据数组的每个元素值进行排序:
asort($prices); while(list($product,$price) = each($prices)){ echo "$product - $price<br />"; }
而函数ksort()则是根据数组的每个关键字进行排序:
ksort($prices); while(list($product,$price) = each($prices)){ echo "$product - $price<br />"; }
6.3 反向排序
即降序排序,与sort()、asort()、ksort()分别对应的是rsort()、arsort()、krsort()。
7.多维数组的排序
7.1 用户定义排序
$products = array( array( 'TIR', 'Tires', 100 ), array( 'OIL', 'Oil', 10 ), array( 'SPK', 'Spark Plugs', 4 ) );
自定义排序需要用函数usort()告诉PHP如何比较各个元素。为此需要编写自己的比较函数。
如下所示对订单数组中的第二列按字母进行排序:
function compare($x, $y){ if($x[1] == $y[1]){ return 0; } else if($x[1] < $y[1]){ return -1; } else{ return 1; } } usort($products,'compare'); for($row = 0; $row < 3; $row++){ for($column = 0; $column < 3; $column++){ echo '|'.$products[$row][$column]; } echo '|<br />'; }
为了能够被usort()函数使用,compare()函数必须比较$x和$y。如果$x等于$y,该函数必须返回0,如果$x小于$y,该函数必须返回负数,大于则返回正数。最后一句调用了内置函数usort(),该函数使用的参数分别是希望保存的数组($products)和比较函数的名称(compare())。
如果要让数组按另一种顺序存储,只要编写一个不同的比较函数。
usort()中的“u”代表“user”,因为这个函数要求传入用户定义的比较函数。
7.2 反向用户排序
用户定义的排序没有反向变体,但可以对一个多维数组进行反向排序。由于用户应该提供比较函数,因此可以编写一个能够返回相反值的比较函数:
function reverse_compare($x, $y){ if($x[2] == $y[2]){ return 0; } else if($x[1] < $y[1]){ return 1; } else{ return -1; } }
8.对数组进行重新排序
shuffle()函数:将数组各元素进行随机排序。
array_reverse()函数:给出一个原来数组的反向排序。
9.从文件载入数组
当前的订单文件:
<?php
//create short variable name
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $orders= file("$DOCUMENT_ROOT/orders.txt"); $number_of_orders = count($orders);
if ($number_of_orders == 0) {
echo "<p><strong>No orders pending.
Please try again later.</strong></p>";
} for ($i=0; $i<$number_of_orders; $i++) {
echo $orders[$i]."<br />";
}
?>
还可以将订单中的每个区段载入到单独的数组元素中,从而可以分开处理每个区段或将它们更好地格式化。
用PHP分离、格式化显示订单内容:
<?php
//create short variable name
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
?>
<html>
<head>
<title>Bob's Auto Parts - Customer Orders</title>
</head>
<body>
<h1>Bob's Auto Parts</h1>
<h2>Customer Orders</h2>
<?php
//Read in the entire file.
//Each order becomes an element in the array
$orders= file("$DOCUMENT_ROOT/orders.txt"); // count the number of orders in the array
$number_of_orders = count($orders); if ($number_of_orders == 0) {
echo "<p><strong>No orders pending.
Please try again later.</strong></p>";
} echo "<table border=\"1\">\n";
echo "<tr><th bgcolor=\"#CCCCFF\">Order Date</th>
<th bgcolor=\"#CCCCFF\">Tires</th>
<th bgcolor=\"#CCCCFF\">Oil</th>
<th bgcolor=\"#CCCCFF\">Spark Plugs</th>
<th bgcolor=\"#CCCCFF\">Total</th>
<th bgcolor=\"#CCCCFF\">Address</th>
<tr>"; for ($i=0; $i<$number_of_orders; $i++) {
//split up each line
$line = explode("\t", $orders[$i]); // keep only the number of items ordered
$line[1] = intval($line[1]);
$line[2] = intval($line[2]);
$line[3] = intval($line[3]); // output each order
echo "<tr>
<td>".$line[0]."</td>
<td align=\"right\">".$line[1]."</td>
<td align=\"right\">".$line[2]."</td>
<td align=\"right\">".$line[3]."</td>
<td align=\"right\">".$line[4]."</td>
<td>".$line[5]."</td>
</tr>";
} echo "</table>";
?>
</body>
</html>
这里使用了explode()函数来分隔每行,这样在开始打印前就可以再做一些处理与格式化。在上一篇中,保存数据的时候使用了制表符作为定界符,因此,将按如下方式调用:
explode(“\t”,$orders[$i]);
可以使用许多方法从字符串中提取数字。这里使用了intval()函数,可以将一个字符串转化成一个整数。
10.执行其他数组操作
10.1 在数组中浏览:each()、current()、reset()、end()、next()、pos()和prev()
如果创建一个新数组,那么当前指针就将被初始化,并指向数组的第一个元素。
调用current($array_name)将返回第一个元素。
调用next()或each()将使指针前移一个元素。其中调用each($array_name)会在指针前移一个位置之前返回当前元素。而调用next($array_name)先将指针前移,然后再返回新的当前元素。
reset()函数将返回指向数组第一个元素的指针。
end()函数将返回指向数组最后一个元素的指针。
prec()函数将当前指针回移一个位置然后再返回新的当前元素。可使用end()和prev()进行反向遍历:
$array = array(7,8,9); $value = end($array); while($value){ echo "$value<br />"; $value = prev($array); }
10.2 对数组的每一个元素应用任何函数:array_walk()
array_walk()函数可以以相同方式使用或者修改数组中的每一个元素。
bool array_walk(array arr,string func,[mixed userdata])
array_walk()的第一个参数是需要处理的数组,第二个参数是用户自定义并且将作用于数组中每个元素的函数。
第三个参数可以作为一个参数传递给自己的函数,可选。
10.3 统计数组元素的个数:count()、sizeof()和array_count_values()
count()函数和sizeof()函数都可以返回数组元素的个数。
调用array_count_values($array)将会统计每个特定的值在数组$array中出现过的次数(数组的基数集)。这个函数将返回一个包含频率表的关联数组。该数组包括关键字以及对应的出现次数。
10.4 将数组转换成标量变量:extract()
函数extract()的作用是通过一个数组创建一系列的标量变量,这些变量的名称必须是数组中关键字的名称,而变量值则是数组中的值。
extract()函数具有两个可选参数:extract_type和prefix。变量extract_type将告诉extract()函数将如何处理冲突。
两个最常用的选项是EXTR_OVERWRITE(默认)和EXTR_PREFIX_ALL。
$array = array('key1'=>'value1','key2'=>'value2','key3'=>'value3'); extract($array,EXTR_PREFIX_ALL,'my_prefix'); echo "$my_prefix_key1 $my_prefix_key2 $my_prefix_key3";
可能你已经注意到了,extract()的关键字必须是一个有效的变量名称才行,以数字开始或包含空格的关键字将被跳过。
整理自《PHP与MySQL Web开发》
PHP学习(4)——数组的使用的更多相关文章
- PHP学习之中数组-遍历一维数组【2】
在PHP学习之中数组[1]中学会怎么创建一个数组,如果PHP学习之中数组[1]中的元素多的话,我们访问元素又是一个问题了,下面我们就使用for语句while,foreach来遍历我们的数组: < ...
- Python学习之数组类型一:
Python学习之数组类型一: Numpy中的向量与矩阵: 1.创建: 向量.矩阵均由array函数创建,区别在于向量是v=array( [逗号分隔的元素] ), 矩阵是M=array( [[ ]] ...
- [ 转载 ] Java基础12--基础学习总结——数组
java基础学习总结——数组 一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的 ...
- Numpy学习之——数组创建
Numpy学习之--数组创建 过程展示 import numpy as np a = np.array([2,3,9]) a array([2, 3, 9]) a.dtype dtype('int32 ...
- [jQuery学习系列二 ]2-JQuery学习二-数组操作
前言 上一篇内容 已经对于Jquery 有了一些认识, 包括Jquery的选择器和DOM对象, 那么这一篇继续来看下Jquery中很实用的Jquery对于数组的操作. Jquery中对数组的操作大致有 ...
- Java菜鸟学习笔记--数组篇(三):二维数组
定义 //1.二维数组的定义 //2.二维数组的内存空间 //3.不规则数组 package me.array; public class Array2Demo{ public static void ...
- Java SE学习之数组——匿名数组和不规则数组
本文是学习网络上的文章时的总结以及自己的一点实践.感谢大家无私的分享. 近期偶然遇到了数组的问题,学习了匿名数组和不规则数组. 匿名数组适用于仅仅使用一次的情况:不规则数组适用是每行数据总数不确定的情 ...
- Scala学习(三)----数组相关操作
数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...
- PHP学习3——数组
主要内容: 简介 常用的方法 循环遍历数组 PHP预定义数组 数组的处理函数 数组 PHP由于是弱类型的语言,他的变量类型是可以自由变换的,他的数组很自由,长度是可以动态增加的. 他的索引默认为数字0 ...
- go语言学习(一):数组/切片
学习区块链之后,发现还要学习加密,接触到的视频是:Go的crypto包,所以开始接触Go.因为和solidity有些相似,但是比solidity简单一些,就开始放松的心态去学习.每天翻着go菜鸟教程, ...
随机推荐
- Centos7静态ip设置(亲测有效)
本文引自:https://www.cnblogs.com/toov5/p/10340395.html,特此鸣谢 最近想测试消息中间件等各类web集群相关技术,这就需要解决linux主机之间互联互通的若 ...
- unity 用代码控制动画的播放的进度
https://answers.unity.com/questions/1225328/imported-animated-object-and-slider-tutorial.html using ...
- 嵌入式linux修改日期时间
命令格式为: date -s 时间字符串 例如只修改系统的日期,不修改时间(时分秒) date -s 2012-08-02 或只修改时间不修改日期 date -s 10:08:00 当然也可以同时修改 ...
- BZOJ 4802: 欧拉函数 (Pollard-Rho)
开始一直T,原来是没有srand- CODE #include<bits/stdc++.h> using namespace std; typedef long long LL; vect ...
- Java小数中的四舍五入
1.怎么设置显示小数位数 public static void main(String[] args) { DecimalFormat decimalFormat = new DecimalForma ...
- Python GUI编程(Tkinter)(一)
tk官网的教程学习: https://tkdocs.com/tutorial/firstexample.html 学习blog: https://www.cnblogs.com/aland-1415/ ...
- IntelliJ IDEA 运行项目的时候提示 Command line is too long 错误
在 IntelliJ IDEA 项目运行的时候收到了下面的错误提示: Error running 'Application': Command line is too long. Shorten co ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- 2 - Rich feature hierarchies for accurate object detection and semantic segmentation(阅读翻译)
Rich feature hierarchies for accurate object detection and semantic segmentation Ross Girshick Jeff ...
- 执行jar包或执行其中的某个类
执行jar包,默认执行javafile中指定的main程序java -jar jar包例如 java -jar test.jar执行依赖其他jar包的class: java -cp .;E:\tool ...