从0到1学PHP(五):PHP 数组:高效存储与处理数据
目录
- 一、数组的定义与分类
- 1.1 索引数组
- 1.2 关联数组
- 1.3 多维数组
- 二、数组的基本操作
- 2.1 数组元素的添加、删除、修改和访问
- 2.2 数组指针的操作
- 三、数组处理函数
- 3.1 数组排序函数
- 3.2 数组统计函数
- 3.3 数组过滤与转换函数
一、数组的定义与分类
在 PHP 中,数组是一种非常重要的数据结构,它允许我们在一个变量中存储多个值,并且可以方便地对这些值进行管理和操作。数组可以分为索引数组、关联数组和多维数组,下面我们来详细了解它们的定义与分类。
1.1 索引数组
索引数组是使用数字索引来存储值的数组,索引从 0 开始依次递增。在 PHP 中,可以使用array()函数或者方括号[]来创建索引数组。例如:
// 使用array()函数创建索引数组
$fruits = array("苹果", "香蕉", "橙子");// 使用方括号创建索引数组
$numbers = [1, 2, 3, 4, 5];
访问索引数组中的元素时,只需使用对应的索引值即可。例如,要访问$fruits数组中的第一个元素,可以这样写:
echo $fruits[0]; // 输出:苹果
也可以通过循环遍历索引数组,例如使用for循环:
$fruits = array("苹果", "香蕉", "橙子");
for ($i = 0; $i < count($fruits); $i++) {echo $fruits[$i]. "<br>";
}
或者使用foreach循环:
$fruits = array("苹果", "香蕉", "橙子");
foreach ($fruits as $fruit) {echo $fruit. "<br>";
}
1.2 关联数组
关联数组与索引数组不同,它使用字符串作为索引(也称为键),而不是数字。这使得我们可以通过有意义的键名来访问数组中的值,提高了代码的可读性和维护性。在 PHP 中,定义关联数组时使用=>符号来指定键值对。例如:
// 创建关联数组
$person = array("name" => "张三","age" => 25,"city" => "北京"
);
访问关联数组中的元素时,使用对应的键名:
echo $person["name"]; // 输出:张三
echo $person["age"]; // 输出:25
同样,也可以使用foreach循环遍历关联数组:
$person = array("name" => "张三","age" => 25,"city" => "北京"
);
foreach ($person as $key => $value) {echo $key. ": ". $value. "<br>";
}
1.3 多维数组
多维数组是指数组中包含其他数组作为元素的数组。这种结构可以用来表示更加复杂的数据,例如表格数据、树状结构等。最常见的多维数组是二维数组,它可以看作是一个由行和列组成的表格。例如,下面是一个二维数组,用于存储学生的成绩:
// 定义二维数组
$scores = array(array(85, 90, 78),array(92, 88, 95),array(76, 82, 89)
);
在这个二维数组中,$scores[0]表示第一行的成绩,$scores[0][0]表示第一行第一列的成绩(即第一个学生的第一门课成绩)。访问多维数组中的元素时,需要使用多个索引值,例如:
echo $scores[1][2]; // 输出:95,表示第二个学生的第三门课成绩
对于多维数组的遍历,可以使用多层循环。例如,遍历上面的$scores数组:
$scores = array(array(85, 90, 78),array(92, 88, 95),array(76, 82, 89)
);
for ($i = 0; $i < count($scores); $i++) {for ($j = 0; $j < count($scores[$i]); $j++) {echo $scores[$i][$j]. " ";}echo "<br>";
}
也可以使用foreach循环结合is_array()函数来递归地遍历多维数组:
function printMultiArray($array) {foreach ($array as $value) {if (is_array($value)) {printMultiArray($value);} else {echo $value. " ";}}echo "<br>";
}$scores = array(array(85, 90, 78),array(92, 88, 95),array(76, 82, 89)
);
printMultiArray($scores);
通过上述介绍,我们对 PHP 中数组的定义与分类有了清晰的认识,这为后续学习数组的基本操作和处理函数打下了坚实的基础。
二、数组的基本操作
在了解了数组的定义与分类后,接下来我们学习数组的基本操作,包括数组元素的添加、删除、修改和访问,以及数组指针的操作。这些操作是我们在使用数组时最常用的,熟练掌握它们可以让我们更加灵活地处理数组数据。
2.1 数组元素的添加、删除、修改和访问
- 添加元素:
- 在 PHP 中,向数组添加元素有多种方法。对于索引数组,可以使用方括号[]直接添加元素,PHP 会自动为新元素分配一个合适的索引(通常是当前最大索引加 1)。例如:
$fruits = array("苹果", "香蕉");
$fruits[] = "橙子";
print_r($fruits);
上述代码中,我们先定义了一个包含 “苹果” 和 “香蕉” 的$fruits数组,然后使用$fruits[] = “橙子”;向数组末尾添加了 “橙子” 这个元素,最后使用print_r()函数输出数组内容,可以看到数组变为Array ( [0] => 苹果 [1] => 香蕉 [2] => 橙子 )。
- 还可以使用array_push()函数向数组末尾添加一个或多个元素。array_push()函数的第一个参数是要操作的数组,后面的参数是要添加的元素。例如:
$fruits = array("苹果", "香蕉");
array_push($fruits, "草莓", "葡萄");
print_r($fruits);
这里通过array_push()函数向$fruits数组中添加了 “草莓” 和 “葡萄” 两个元素,输出的数组为Array ( [0] => 苹果 [1] => 香蕉 [2] => 草莓 [3] => 葡萄 )。
对于关联数组,添加元素时需要指定键名,通过$数组名[键名] = 值;的方式来添加。例如:
$person = array("name" => "张三");
$person["age"] = 25;
$person["city"] = "北京";
print_r($person);
此代码先定义了一个关联数组$person,只有 “name” 这个键值对,然后依次添加了 “age” 和 “city” 键值对,最终输出的数组为Array ( [name] => 张三 [age] => 25 [city] => 北京 )。
- 删除元素:
使用unset()函数可以删除数组中的元素。unset()函数接受一个或多个参数,每个参数是要删除的数组元素的索引或键。例如,删除索引数组中的元素:
$fruits = array("苹果", "香蕉", "橙子");
unset($fruits[1]);
print_r($fruits);
这段代码删除了$fruits数组中索引为 1 的元素(即 “香蕉”),输出的数组变为Array ( [0] => 苹果 [2] => 橙子 ),需要注意的是,使用unset()函数删除元素后,数组的索引不会自动重新排列。
对于关联数组,同样使用unset()函数根据键来删除元素:
$person = array("name" => "张三", "age" => 25, "city" => "北京");
unset($person["age"]);
print_r($person);
这里删除了$person数组中 “age” 这个键值对,输出结果为Array ( [name] => 张三 [city] => 北京 )。
- 修改元素:
直接通过索引或键对数组元素进行赋值,就可以修改数组中的元素。对于索引数组:
$fruits = array("苹果", "香蕉", "橙子");
$fruits[1] = "芒果";
print_r($fruits);
上述代码将$fruits数组中索引为 1 的元素 “香蕉” 修改为 “芒果”,输出数组为Array ( [0] => 苹果 [1] => 芒果 [2] => 橙子 )。
对于关联数组:
$person = array("name" => "张三", "age" => 25, "city" => "北京");
$person["age"] = 26;
print_r($person);
此代码将$person数组中 “age” 对应的值从 25 修改为 26,输出结果是Array ( [name] => 张三 [age] => 26 [city] => 北京 )。
- 访问元素:
通过索引或键来访问数组中的元素。对于索引数组,使用索引值即可访问对应的元素,如$fruits[0]表示访问$fruits数组中的第一个元素。对于关联数组,使用键名来访问元素,如$person[“name”]表示访问$person数组中 “name” 对应的元素。
2.2 数组指针的操作
PHP 数组有一个内部指针,它指向数组中的某个元素,通过一些函数可以操作这个指针,从而实现对数组元素的遍历等操作。常见的数组指针操作函数有current()、next()、prev()、end()和reset()等。
- current()函数:返回数组中当前指针指向的元素的值。例如:
$fruits = array("苹果", "香蕉", "橙子");
echo current($fruits); // 输出:苹果
数组创建后,指针默认指向第一个元素,所以current($fruits)返回 “苹果”。
- next()函数:将数组的内部指针向前移动一位,并返回移动后指针指向的元素的值。如果移动后指针超出了数组的范围,则返回false。例如:
$fruits = array("苹果", "香蕉", "橙子");
echo current($fruits). "<br>"; // 输出:苹果
echo next($fruits). "<br>"; // 输出:香蕉
echo next($fruits). "<br>"; // 输出:橙子
echo next($fruits); // 输出:(bool)false
- prev()函数:与next()函数相反,将数组的内部指针向后移动一位,并返回移动后指针指向的元素的值。如果移动后指针超出了数组的范围,则返回false。例如:
$fruits = array("苹果", "香蕉", "橙子");
next($fruits);
next($fruits);
echo current($fruits). "<br>"; // 输出:橙子
echo prev($fruits). "<br>"; // 输出:香蕉
- end()函数:将数组的内部指针移动到最后一个元素,并返回最后一个元素的值。例如:
$fruits = array("苹果", "香蕉", "橙子");
echo end($fruits); // 输出:橙子
- reset()函数:将数组的内部指针重置到第一个元素,并返回第一个元素的值。在多次使用next()或prev()等函数移动指针后,如果想重新从数组开头遍历,可以使用reset()函数。例如:
$fruits = array("苹果", "香蕉", "橙子");
next($fruits);
next($fruits);
echo current($fruits). "<br>"; // 输出:橙子
reset($fruits);
echo current($fruits); // 输出:苹果
通过这些数组指针操作函数,我们可以灵活地遍历数组,按照自己的需求对数组元素进行处理。
三、数组处理函数
在 PHP 中,提供了丰富的数组处理函数,这些函数可以帮助我们更高效地对数组进行各种操作。下面将介绍数组排序函数、数组统计函数以及数组过滤与转换函数。
3.1 数组排序函数
PHP 提供了多个数组排序函数,每个函数都有其独特的用途和特点。
- sort () 函数:用于对索引数组进行升序排序。排序后,数组的索引会重新从 0 开始依次递增。例如:
$numbers = array(5, 2, 8, 1, 9);
sort($numbers);
print_r($numbers);
上述代码中,$numbers数组初始包含 5 个元素,使用sort()函数排序后,输出结果为Array ( [0] => 1 [1] => 2 [2] => 5 [3] => 8 [4] => 9 ) ,可以看到数组元素按照从小到大的顺序排列,且索引重新分配。
- rsort () 函数:与sort()函数相反,用于对索引数组进行降序排序,排序后索引同样会重新从 0 开始依次递增。例如:
$numbers = array(5, 2, 8, 1, 9);
rsort($numbers);
print_r($numbers);
这里$numbers数组经过rsort()函数处理后,输出结果为Array ( [0] => 9 [1] => 8 [2] => 5 [3] => 2 [4] => 1 ),数组元素按从大到小的顺序排列,索引重新生成。
- asort () 函数:用于对关联数组按照值进行升序排序,排序后键值对的关联关系保持不变。例如:
$person = array("name" => "张三","age" => 25,"city" => "北京"
);
asort($person);
print_r($person);
运行这段代码,$person数组会根据值进行升序排序,输出结果为Array ( [age] => 25 [city] => 北京 [name] => 张三 ) ,可以看到键值对的对应关系依然存在,只是按照值的大小重新排列了顺序。
- arsort () 函数:与asort()函数相反,对关联数组按照值进行降序排序,同时保持键值对的关联关系。例如:
$person = array("name" => "张三","age" => 25,"city" => "北京"
);
arsort($person);
print_r($person);
此时$person数组按值降序排序,输出为Array ( [name] => 张三 [city] => 北京 [age] => 25 ) 。
- ksort () 函数:用于对关联数组按照键进行升序排序,键值对的关联关系在排序后保持不变。例如:
$person = array("name" => "张三","age" => 25,"city" => "北京"
);
ksort($person);
print_r($person);
运行结果为Array ( [age] => 25 [city] => 北京 [name] => 张三 ),数组按照键名的字母顺序(升序)进行了排序。
- krsort () 函数:与ksort()函数相反,对关联数组按照键进行降序排序,键值对的关联关系保持不变。例如:
$person = array("name" => "张三","age" => 25,"city" => "北京"
);
krsort($person);
print_r($person);
输出结果为Array ( [name] => 张三 [city] => 北京 [age] => 25 ),数组按照键名的字母顺序(降序)进行了排序。
3.2 数组统计函数
PHP 中的数组统计函数可以帮助我们获取数组的一些统计信息,如元素个数、最大值和最小值等。
- count () 函数:用于计算数组中的元素个数,对于多维数组,还可以通过设置参数来递归计算所有元素的总数。其基本语法为int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] ),其中$array_or_countable是要计数的数组或实现了Countable接口的对象,$mode是可选参数,默认值COUNT_NORMAL表示只计算第一级元素,如果设置为COUNT_RECURSIVE,则递归计算所有元素。例如:
$fruits = array("苹果", "香蕉", "橙子");
echo count($fruits); // 输出:3
对于多维数组:
$nestedArray = array(array(1, 2, 3),array(4, 5),array(6)
);
echo count($nestedArray); // 输出:3,只计算第一级元素个数
echo count($nestedArray, COUNT_RECURSIVE); // 输出:6,递归计算所有元素个数
- max () 函数:返回数组中的最大值。例如:
$numbers = array(5, 2, 8, 1, 9);
echo max($numbers); // 输出:9
如果数组中包含字符串类型的元素,max()函数会按照字符串的字典序进行比较。例如:
$strings = array("banana", "apple", "cherry");
echo max($strings); // 输出:cherry
- min () 函数:与max()函数相反,返回数组中的最小值。例如:
$numbers = array(5, 2, 8, 1, 9);
echo min($numbers); // 输出:1
同样,对于包含字符串元素的数组,min()函数按字典序返回最小的字符串:
$strings = array("banana", "apple", "cherry");
echo min($strings); // 输出:apple
3.3 数组过滤与转换函数
- array_filter () 函数:使用回调函数过滤数组中的元素。该函数会将数组中的每个元素传递给回调函数,如果回调函数返回true,则该元素会被保留在结果数组中;如果返回false,则该元素会被过滤掉。其语法为array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )。例如,过滤出数组中的奇数:
$numbers = array(1, 2, 3, 4, 5);
function isOdd($number) {return $number % 2 == 1;
}
$filteredNumbers = array_filter($numbers, 'isOdd');
print_r($filteredNumbers);
上述代码中,array_filter()函数使用isOdd回调函数对$numbers数组进行过滤,只有奇数元素被保留,输出结果为Array ( [0] => 1 [2] => 3 [4] => 5 )。
- array_flip () 函数:用于交换数组中的键和值,即原来的键变为值,原来的值变为键。需要注意的是,如果数组中有重复的值,在交换后,后面的键会覆盖前面的键,因为键在数组中必须是唯一的。例如:
$fruits = array("苹果" => "red", "香蕉" => "yellow", "橙子" => "orange");
$flippedFruits = array_flip($fruits);
print_r($flippedFruits);
运行结果为Array ( [red] => 苹果 [yellow] => 香蕉 [orange] => 橙子 ) ,实现了键值的交换。如果原数组中有重复值,比如:
$colors = array("apple" => "red", "cherry" => "red");
$flippedColors = array_flip($colors);
print_r($flippedColors);
输出结果为Array ( [red] => cherry ),因为 “red” 值重复,后面的 “cherry” 键覆盖了前面的 “apple” 键。