PHP 速成课程(3):数组操作

今天你将学习 PHP 中的数组创建和操作。

首先,这是 Web 开发中非常常见的场景,它将帮助你理解为什么我们需要数组。

在下一个示例中,我们需要显示产品及其价格的列表。

1
2
3
4
5
6
7
8
9
10
11
$product1 = "iPad";
$product2 = "iPhone";
$product3 = "iWatch";

$price1 = 599;
$price2 = 899;
$price3 = 699;

echo $product1 . ' : ' . $price1 . '<br>';
echo $product2 . ' : ' . $price2 . '<br>';
echo $product3 . ' : ' . $price3 . '<br>';

你可以想象,此代码远非最佳。想象一下,如果我们有 100 种产品甚至 10,000 种产品。

有一种方法可以更有效地完成前面的示例数组。

PHP 中的数组是值的列表。数组中的值可以是不同类型的。

定义数组

要定义数组,我们使用方括号 [ ]

1
$products = [];

变量 $products 是一个数组

可以创建一个包含内容的数组

1
$products = ['iPad', 'iPhone', 'iWatch'];

此数组包含三个字符串:iPad、iPhone、iWatch

每个数组元素都用逗号分隔。

数组中可以包含不同类型的变量

1
$array = ['First entry', 100, true];

甚至可以在数组中创建数组

1
$array = ['First entry', 100, ['iPad', 'iPhone'], false];

访问项目

1
2
echo $array[0];
// First entry

数组元素的索引从 0 开始。因此,第一个项位于位置 0,第二个项位于位置 1,依此类推。

1
2
$array = ['First entry', 100, ['iPad', 'iPhone'], false];
0 1 2 3

要访问数组中的数组,请使用以下语法

1
2
echo $array[2][1];
// iPhone

这里我们显示元素 2,即 [‘iPad’, ‘iPhone’]
那么元素 1 就是 iPhone

如果你尝试访问不存在的项目。PHP 将返回警告和值 null

1
2
3
4
5
$array = ['First entry', 100, true];

echo $array[3];
// null
// Warning: Undefined array key 3

计数

要确定数组中的项目数,可以使用 count() 函数

1
2
3
4
$array = ['First entry', 100, true];

echo count($array);
// 3

操作

在数组末尾添加一个元素

1
2
3
$array[] = 'Last';

// ['First entry', 100, ['iPad', 'iPhone'], false, 'Last']

从数组中删除一个元素

1
2
3
unset($array[0]);

// [100, ['iPad', 'iPhone'], false, 'Last']

使用 implode 函数将数组转换为字符串

1
2
3
$array = ['One', 'Two', 'Three'];
echo implode(', ', $array);
// "One, Two, Three"

第一个参数是分隔符。

使用 explode 函数将字符串转换为数组

1
2
$text = 'William, Shawn, John';
echo explode(',', $text); // ['William', 'Shawn', 'John'];

第一个参数是分隔符。

遍历

foreach 函数对数组的每个元素执行代码。

1
2
3
4
5
$names = ['William', 'Shawn', 'John'];

foreach($names as $name) {
echo 'Hello ' . $name;
}

第一个参数是要浏览的数组的名称,第二个参数表示对当前元素的引用。

关联数组

到目前为止,我们已经了解了数组的工作原理。它们有一个从 0 开始的数字键。

可以使用自定义键创建数组。这就是 PHP 所称的关联数组。

1
$person = ['age' => 45, 'genre' => 'men'];

这里的“age”和“gender”是键。45 和 men 是与这些键关联的值。
请注意,一些编程语言将这种类型的数组称为字典。
关联数组非常实用,你必须很好地理解它们,因为你将经常使用它们。它们非常适合存储信息。

1
$product = ['id' => 100, 'name' => 'iPad', 'price' => 699];

使用键访问数组值

1
echo "Product :" . $product['name'];

通过指定新键,可以向数组添加键/值

1
$product['qty'] = 5;

可以检查键名是否存在

1
2
3
4
$product = ['id' => 100, 'name' => 'iPad', 'price' => 699];

echo array_key_exists('id', $product);
// true

使用值和键循环关联数组

1
2
3
foreach($names as $key => $value) {
echo $key . ' : ' . $value;
}

连接:连接两个数组

1
2
3
4
5
$names1 = ['William', 'Paul', 'Tom'];
$names2 = ['John', 'Sam'];

$allNames = array_merge($names1, $names2);
// ['William', 'Paul', 'Tom', 'John', 'Sam'];

与扩展运算符连接 (...)

1
2
3
4
5
$names1 = ['William', 'Paul', 'Tom'];
$names2 = ['John', 'Sam'];

$allNames = [...$names1, ...$names2];
// ['William', 'Paul', 'Tom', 'John', 'Sam'];

这里,数组名称 (...$names) 之前的扩展运算符会解构该数组。

关联数组的数组

经常使用的模式是包含关联数组的数组。

1
2
3
4
5
6
$items = [
['id' => '100', 'name' => 'product 1'],
['id' => '200', 'name' => 'product 2'],
['id' => '300', 'name' => 'product 3'],
['id' => '400', 'name' => 'product 4'],
];

这种表格非常适合表示数据。可以循环显示每个项目

1
2
3
foreach($items as $item) {
echo $item['name'] . <br>;
}

as 语句创建对数组项的引用。

检索数组的一部分

有多个函数可让你检索数组的一部分。仅检索键或值

1
2
3
4
5
6
7
$person = ['age' => 45, 'genre' => 'men'];

// Return an array with only keys
echo array_keys($person); // ['age', 'genre']

// Return an array with only values
echo array_values($person); // [45, 'men']

使用 array_filter() 函数检索符合特定条件的项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$items = [
['id' => 100, 'name' => 'product 1'],
['id' => 200, 'name' => 'product 2'],
['id' => 300, 'name' => 'product 3'],
['id' => 400, 'name' => 'product 4'],
];

$filteredItem = array_filter($items, function ($product) {
return $product['id'] > 200;
});

print_r($filteredItem);
// $items = [
// ['id' => '300', 'name' => 'product 3'],
// ['id' => '400', 'name' => 'product 4'],
// ];

array_filter() 函数是一个以回调函数为参数的函数。对于数组中的每个项目,将计算一个表达式。如果表达式为真,则当前项目将包含在结果数组中。

在数组中搜索

1
2
3
4
5
6
7
8
9
$items = [
['id' => '100', 'name' => 'product 1'],
['id' => '200', 'name' => 'product 2'],
['id' => '300', 'name' => 'product 3'],
['id' => '400', 'name' => 'product 4'],
];

$found_key = array_search('product 3', array_column($items, 'name'));
// 2

array_search() 函数允许你根据搜索条件搜索特定键。在最后一个示例中,我们在“名称”列中查找“产品 3”的键

使用 array_map() 函数创建一个新数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$items = [
['id' => 100, 'name' => 'product 1'],
['id' => 200, 'name' => 'product 2'],
['id' => 300, 'name' => 'product 3'],
['id' => 400, 'name' => 'product 4'],
];

$mapItems = array_map(function ($product) {
return [
'id' => $product['id'] * 2,
'name' => $product['name']
];
}, $items);

print_r($mapItems);
//[
['id' => 200, 'name' => 'product 1'],
['id' => 400, 'name' => 'product 2'],
['id' => 600, 'name' => 'product 3'],
['id' => 800, 'name' => 'product 4'],
];

array_map() 函数返回一个数组,其中包含每个回调项将返回的内容。

array_map() 函数必须有两个参数:一个回调函数和一个数组。例如 array_map(回调函数,数组)

array_map() 函数循环遍历每个数组项,同时构建一个新数组。新数组中的每个项都是回调函数的结果(返回)。在最后一个示例中,每个循环都返回一个具有 id * 2 和产品名称的项。

原始表未修改,而是创建了一个新表。

array_reduce() 函数

此函数接受一个数组并将其简化为单个值。例如,返回将数组中包含的所有数字相加的结果。

1
2
3
4
5
6
7
8
$numbers = [2, 4, 6, 100];

$sum = array_reduce($numbers, function ($num, $total) {
return $total + $num;
}, 0);

print_r($sum);
// 112

array_reduce() 函数接受两个参数:对实际项目的引用和总变量。对于每次迭代,回调函数都会在总变量中返回结果。


相关文章: