从零开始编写PHP学习系列教程
第四章:数组与数据处理
4.1 PHP数组的使用
PHP数组是存储多个元素的数据结构,可以通过一个单一的变量访问多个值。数组可以分为索引数组和关联数组两种。
索引数组
索引数组的索引是数字,自动从0开始。创建和访问索引数组的方式如下:
// 创建索引数组
$fruits = array("Apple", "Banana", "Cherry");
// 使用新的数组语法
$fruits = ["Apple", "Banana", "Cherry"];
// 访问数组元素
echo $fruits[0]; // 输出 "Apple"
关联数组
关联数组的索引可以是字符串,用于存储键值对。
// 创建关联数组
$ages = array("Peter" => 22, "Clark" => 32, "John" => 28);
// 使用新的数组语法
$ages = ["Peter" => 22, "Clark" => 32, "John" => 28];
// 访问数组元素
echo $ages["Peter"]; // 输出 22
常用数组函数
- array_push() 向数组尾部添加一个或多个元素。
- array_pop() 删除数组的最后一个元素。
- count() 计算数组中的元素数目或对象中的属性个数。
- isset() 检测变量是否已设置并且非null。
$numbers = [1, 2, 3];
array_push($numbers, 4); // 数组变为 [1, 2, 3, 4]
$lastItem = array_pop($numbers); // 移除4,数组变为 [1, 2, 3]
echo count($numbers); // 输出 3
echo isset($numbers[2]); // 输出 1 (true)
遍历数组
遍历数组可以使用for循环、foreach循环或数组迭代器。
For循环
适用于索引数组,需要知道数组长度。
$fruits = ["Apple", "Banana", "Cherry"];
for ($i = 0; $i < count($fruits); $i++) {
echo $fruits[$i] . "\n";
}
Foreach循环
适用于索引数组和关联数组,是PHP遍历数组的推荐方式。
// 索引数组
foreach ($fruits as $fruit) {
echo $fruit . "\n";
}
// 关联数组
foreach ($ages as $name => $age) {
echo "$name is $age years old.\n";
}
数组迭代器
使用ArrayIterator或其他SPL提供的迭代器来遍历数组。
$iterator = new ArrayIterator($fruits);
while ($iterator->valid()) {
echo $iterator->current() . "\n";
$iterator->next();
}
总结
PHP的数组和数组处理功能非常强大,通过不同的函数和遍历方法可以灵活处理数据。掌握这些基本概念和技能对于开发复杂的PHP应用至关重要。
4.2 数据排序与过滤
在PHP中,有多种内置函数用于数组排序、查找、数据验证和映射操作。这些功能强大的函数可以帮助开发者有效地处理和操作数据。
数据排序
PHP提供了多种数组排序函数,适用于不同的场景和需求。
- sort():对数组进行升序排序。该函数会重新索引数组。
$numbers = [4, 2, 3, 1];
sort($numbers);
print_r($numbers); // 输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
- rsort():对数组进行降序排序。该函数也会重新索引数组。
$numbers = [1, 3, 2, 4];
rsort($numbers);
print_r($numbers); // 输出:Array ( [0] => 4 [1] => 3 [2] => 2 [3] => 1 )
- asort():对数组进行升序排序,保持索引关系。适用于关联数组。
$ages = ["Peter" => 35, "Ben" => 37, "Joe" => 43];
asort($ages);
print_r($ages); // 输出:Array ( [Peter] => 35 [Ben] => 37 [Joe] => 43 )
- arsort():对数组进行降序排序,保持索引关系。适用于关联数组。
$ages = ["Peter" => 35, "Ben" => 37, "Joe" => 43];
arsort($ages);
print_r($ages); // 输出:Array ( [Joe] => 43 [Ben] => 37 [Peter] => 35 )
- ksort():根据键名对数组进行升序排序。
$ages = ["Peter" => 35, "Ben" => 37, "Joe" => 43];
ksort($ages);
print_r($ages); // 输出:Array ( [Ben] => 37 [Joe] => 43 [Peter] => 35 )
- krsort():根据键名对数组进行降序排序。
krsort($ages);
print_r($ages); // 输出:Array ( [Peter] => 35 [Joe] => 43 [Ben] => 37 )
- usort():使用用户自定义的比较函数对数组中的值进行排序。
$numbers = [4, 2, 3, 1];
usort($numbers, function($a, $b) {
return $a <=> $b;
});
print_r($numbers); // 输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
return $a <=> $b;
这行代码在PHP中使用了 spaceship operator(太空船运算符),它是一个三向比较运算符,用于比较两个表达式 $a
和 $b
的值,并根据它们之间的关系返回一个整数值,具体含义如下:
- 如果
$a
小于$b
,返回-1
; - 如果
$a
等于$b
,返回0
; - 如果
$a
大于$b
,返回1
。
这个运算符非常方便用于对数组或其他序列进行排序,因为它可以一次性完成大小关系的判断,而不需要分别使用等于、大于和小于的三个条件语句。例如,在排序函数中使用它可以简化排序逻辑的编写。
查找函数
-
array_search():在数组中搜索给定的值,如果成功,则返回相应的键名。
$key = array_search(3, $numbers); // 返回 2
+ in_array():检查数组中是否存在某个值。
```php
if (in_array(3, $numbers)) {
echo "找到值 3";
}
数据验证和清理
- filter_var():通过指定的过滤器对变量进行过滤和验证。常用于表单输入验证。
$email = "user@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "这是一个有效的邮箱地址";
}
数组元素映射
-
array_map():对数组中的每个元素应用回调函数。
$numbers = [1, 2, 3, 4];
s
q
u
a
r
e
d
=
a
r
r
a
y
m
a
p
(
f
u
n
c
t
i
o
n
(
squared = array_map(function(
squared=arraymap(function(n) { return $n * $n; },
n
u
m
b
e
r
s
)
;
p
r
i
n
t
r
(
numbers); print_r(
numbers);printr(squared);

**数组元素映射**
+ array_reduce():使用回调函数迭代地将数组简化为单一的值。虽然不是映射函数,但与array_map()相辅相成,用于对数组数据进行累加或累积运算。
```php
$numbers = [1, 2, 3, 4];
$sum = array_reduce($numbers, function($carry, $item) {
return $carry + $item;
}, 0);
echo $sum; // 输出:10
以上介绍了PHP中数组处理的函数,它们提供了强大的工具集来进行数组排序、查找、数据验证和元素映射。
更多数组操作函数
-
array_filter():使用回调函数过滤数组中的元素,通常用于移除不需要的元素。该函数不改变原数组键名。
$numbers = [1, 2, 3, 4, 5, 6];
e
v
e
n
=
a
r
r
a
y
f
i
l
t
e
r
(
even = array_filter(
even=arrayfilter(numbers, function($n) {
return KaTeX parse error: Expected 'EOF', got '}' at position 13: n % 2 == 0; }̲); print_r(even); // 输出:Array ( [1] => 2 [3] => 4 [5] => 6 )
+ arraykeyexists():检查给定的键名或索引是否存在于数组中。
```php
$array = ['a' => 1, 'b' => 2, 'c' => 3];
if (array_key_exists('b', $array)) {
echo "'b' 存在于数组中";
}
-
array_keys():返回数组所有的键名。
k
e
y
s
=
a
r
r
a
y
k
e
y
s
(
keys = array_keys(
keys=arraykeys(array);
print_r($keys); // 输出:Array ( [0] => a [1] => b [2] => c )
+ array_values():返回数组所有的值。
```php
$values = array_values($array);
print_r($values); // 输出:Array ( [0] => 1 [1] => 2 [2] => 3 )
多维数组和复杂数据结构的操作
- array_multisort():可以用来排序多个数组,或者多维数组的多个维度。
- arraywalk() 和 arraywalk_recursive():对数组中的每个成员应用用户函数。array_walk_recursive()对数组进行递归操作,可以用于多维数组。
总结
PHP的数组操作函数非常丰富,提供了数据排序、查找、验证和映射等多方面的功能。了解并熟练使用这些函数,可以帮助开发者更加高效地处理和操作数据。实际应用中,常常需要根据具体需求选择合适的函数,有时还会组合使用多个函数以实现复杂的数据操作。