PHP数组可通过array()或[]创建,推荐用foreach遍历,索引数组用for时应缓存count值以优化性能。

PHP数组的创建和遍历,是PHP开发里最基础也最常用的操作。简单来说,创建数组可以通过多种灵活的方式实现,比如直接用
array()
[]
foreach
for
创建PHP数组其实挺随性的,不像有些语言那么死板。
创建数组:
使用 array()
// 索引数组
$fruits = array("apple", "banana", "orange");
echo $fruits[0]; // 输出: apple
// 关联数组
$person = array(
"name" => "Alice",
"age" => 30,
"city" => "New York"
);
echo $person["name"]; // 输出: Alice使用方括号 []
// 索引数组
$colors = ["red", "green", "blue"];
echo $colors[1]; // 输出: green
// 关联数组
$product = [
"id" => 101,
"name" => "Laptop",
"price" => 1200.00
];
echo $product["name"]; // 输出: Laptop隐式创建或赋值: 当你给一个变量的数组下标赋值时,如果这个变量还不是数组,PHP会自动把它变成一个数组。
$data = []; // 先初始化为空数组是个好习惯 $data[] = "first item"; // 索引0 $data[] = "second item"; // 索引1 $data["key"] = "value"; // 关联键 echo $data[0]; // 输出: first item echo $data["key"]; // 输出: value
这里有个小细节,如果直接
$data[] = "item";
$data = [];
立即学习“PHP免费学习笔记(深入)”;
遍历数组:
遍历数组就是把数组里的每个元素都走一遍,取到它的值,有时也需要它的键。
foreach
foreach
$fruits = ["apple", "banana", "orange"];
foreach ($fruits as $fruit) {
echo $fruit . "\n";
}
// 输出:
// apple
// banana
// orange
$person = [
"name" => "Bob",
"age" => 25,
"occupation" => "Engineer"
];
foreach ($person as $key => $value) {
echo $key . ": " . $value . "\n";
}
// 输出:
// name: Bob
// age: 25
// occupation: Engineer个人觉得,除非有非常特殊的性能或索引需求,
foreach
for
for
$colors = ["red", "green", "blue", "yellow"];
for ($i = 0; $i < count($colors); $i++) {
echo $colors[$i] . "\n";
}
// 输出:
// red
// green
// blue
// yellow用
for
count($colors)
while
list()
each()
each()
each()
// $data = ["a" => 1, "b" => 2];
// while (list($key, $value) = each($data)) {
// echo "$key: $value\n";
// }现在如果你需要类似
each()
reset()
next()
key()
current()
foreach
PHP数组的强大之处在于它的混合性,但理解索引数组和关联数组是基础。它们的核心区别在于键(key)的类型。
索引数组 (Indexed Arrays):
$numbers = [10, 20, 30]; // 键分别是 0, 1, 2 echo $numbers[0]; // 输出 10
关联数组 (Associative Arrays):
$userProfile = [
"username" => "john_doe",
"email" => "john@example.com",
"age" => 28
];
echo $userProfile["email"]; // 输出 john@example.com如何选择? 这真的取决于你的数据模型和需求。
PHP的灵活性在于你可以混合使用这两种类型,比如一个数组的某些元素是索引的,另一些是关联的。但这通常不推荐,因为它会降低代码的可读性和维护性。保持数组类型的一致性是个好习惯。
在遍历PHP数组时,获取键和值是核心操作,而
foreach
获取键和值:
foreach ($array as $key => $value)
$key
$value
$settings = [
"theme" => "dark",
"language" => "en",
"notifications" => true
];
foreach ($settings as $settingKey => $settingValue) {
echo "Setting: " . $settingKey . " = " . (is_bool($settingValue) ? ($settingValue ? "true" : "false") : $settingValue) . "\n";
}
// 输出:
// Setting: theme = dark
// Setting: language = en
// Setting: notifications = true这里我用了一个三元运算符来处理布尔值的输出,让结果更直观。
foreach ($array as $value)
$key
$value
$tasks = ["Write code", "Review PR", "Deploy"];
foreach ($tasks as $task) {
echo "Task: " . $task . "\n";
}
// 输出:
// Task: Write code
// Task: Review PR
// Task: Deployfor
$i
$items = ["itemA", "itemB", "itemC"];
for ($i = 0; $i < count($items); $i++) {
echo "Key: " . $i . ", Value: " . $items[$i] . "\n";
}高级用法和函数:
除了基本的循环,PHP还提供了一些内置函数,可以实现更高级的数组遍历和操作:
array_map()
$numbers = [1, 2, 3, 4];
$squaredNumbers = array_map(function($n) {
return $n * $n;
}, $numbers);
print_r($squaredNumbers);
// 输出: Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 )array_map
array_filter()
true
$scores = [85, 92, 78, 65, 95];
$passingScores = array_filter($scores, function($score) {
return $score >= 80;
});
print_r($passingScores);
// 输出: Array ( [0] => 85 [1] => 92 [4] => 95 )
// 注意:键保持不变如果你想重置键,可以再用
array_values()
array_walk()
array_map
array_walk
$names = ["alice", "bob", "charlie"];
array_walk($names, function(&$name, $key) { // 注意这里的 & 符号
$name = ucfirst($name); // 将首字母大写
});
print_r($names);
// 输出: Array ( [0] => Alice [1] => Bob [2] => Charlie )array_walk
array_reduce()
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, function($carry, $item) {
return $carry + $item;
}, 0); // 0 是初始值
echo "Sum: " . $sum; // 输出: Sum: 15array_reduce
这些高级函数提供了一种更“函数式编程”的风格来处理数组,代码通常更简洁,意图也更明确,尤其是在处理大型数据集时,可以避免手动循环带来的冗余代码。
在PHP中处理数组,尤其是在大型应用或处理大数据量时,性能优化是个绕不开的话题。一些看似不起眼的小习惯,可能成为性能瓶颈。
常见的性能陷阱:
在 for
count()
$largeArray = range(0, 100000); // 假设一个大数组
for ($i = 0; $i < count($largeArray); $i++) { // 每次迭代都调用 count()
// ... do something
}count()
不必要的数组复制: PHP在某些操作中会创建数组的副本,尤其是当数组作为函数参数传递时,如果函数内部修改了数组,且没有通过引用传递,就会发生复制。大数组的复制会消耗大量内存和CPU时间。
function processArray($arr) { // $arr 是副本
$arr[] = "new_item"; // 修改的是副本
return $arr;
}
$myArray = range(0, 100000);
$newArray = processArray($myArray); // 这里发生了复制在循环内部执行数据库查询或文件I/O: 这不完全是数组遍历本身的陷阱,但经常在遍历数组时发生。
$userIds = [1, 2, 3, ...];
foreach ($userIds as $userId) {
// 每次循环都执行一个数据库查询
$user = DB::query("SELECT * FROM users WHERE id = ?", [$userId]);
// ...
}这种“N+1查询”问题是性能杀手。
使用 array_merge()
array_unique()
优化建议:
预先缓存 count()
for
$largeArray = range(0, 100000);
$count = count($largeArray); // 提前计算一次
for ($i = 0; $i < $count; $i++) {
// ... do something
}这个改动虽小,但对
for
优先使用 foreach
foreach
for
foreach
for
通过引用传递大数组给函数: 如果函数需要修改数组,并且你不希望创建副本,可以通过引用传递。
function processArrayByRef(&$arr) { // 注意 & 符号
$arr[] = "new_item"; // 修改的是原数组
}
$myArray = range(0, 100000);
processArrayByRef($myArray); // 没有发生复制但使用引用要小心,它可能导致意外的副作用,降低代码的可预测性。
批量处理数据库查询和文件I/O: 对于N+1查询问题,通常可以通过一次性获取所有需要的数据来解决。
$userIds = [1, 2, 3, ...];
// 使用 IN 子句一次性查询所有用户
$users = DB::query("SELECT * FROM users WHERE id IN (?)", [implode(',', $userIds)]);
// 然后在内存中处理 $users 数组
foreach ($userIds as $userId) {
// ... 从 $users 数组中查找对应用户,而不是再次查询数据库
}类似地,文件操作也应考虑批量读写。
合理使用 array_map()
array_filter()
array_reduce()
array_map
array_walk
避免在循环中创建大量临时对象或变量: 每次循环都
new
理解 PHP 数组的底层实现: PHP 数组是哈希表,这意味着无论是索引数组还是关联数组,其查找、插入、删除操作的平均时间复杂度都是 O(1)。但在极端情况下(例如哈希冲突严重),性能可能会下降。通常情况下,你不需要过度担心底层实现,但知道这一点有助于理解其灵活性和性能特征。
总之,优化数组遍历并非一概而论,需要根据具体的应用场景和数组大小来选择最合适的方法。大部分时候,
foreach
以上就是php数组如何创建和遍历_php创建数组与循环遍历教程的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号