文章目录
foreach
基础语法:
foreach (iterable as value) {
// 循环体
}
foreach (iterable as key => $value) {
// 循环体
}
案例1:
c
$fruits = ["a" => "Apple", "b" => "Banana", "c" => "Cherry"];
foreach ($fruits as $key => $value) {
echo "$key: $value\n";
}
输出:
a: Apple
b: Banana
c: Cherry
引用传递模式:
c
$numbers = [1, 2, 3];
foreach ($numbers as &$num) {
$num *= 2; // 直接修改原数组
}
print_r($numbers); // 输出 [2, 4, 6]
// 重要:必须 unset 引用变量
unset($num);
嵌套数组处理:
c
$matrix = [
[1, 2],
[3, 4],
[5, 6]
];
foreach ($matrix as $row) {
foreach ($row as $cell) {
echo $cell . " ";
}
echo "\n";
}
// 输出:
// 1 2
// 3 4
// 5 6
避免在循环中计算数组长度:
c
// 低效(每次循环都计算 count())
for ($i=0; $i<count($array); $i++) { /* ... */ }
// 高效(只计算一次)
$length = count($array);
for ($i=0; $i<$length; $i++) { /* ... */ }
// 最佳(foreach 自动处理)
foreach ($array as $value) { /* ... */ }
使用引用减少内存拷贝:
c
$largeArray = range(1, 100000);
// 低效(创建值拷贝)
foreach ($largeArray as $value) { /* ... */ }
// 高效(直接操作原数据)
foreach ($largeArray as &$value) { /* ... */ }
实战:
修改数组结构:
c
$colors = ['red', 'green', 'blue'];
foreach ($colors as $key => $color) {
if ($color === 'green') {
unset($colors[$key]); // 危险操作!
}
}
// 解决方案:先收集要删除的键
$toDelete = [];
foreach ($colors as $key => $color) {
if ($color === 'green') $toDelete[] = $key;
}
foreach ($toDelete as $key) {
unset($colors[$key]);
}
打印数组
c
// 创建 1-10 的连续数组
$numbers = range(1, 10);
// 使用 foreach 遍历打印
foreach ($numbers as $number) {
//使用`.`操作符连接字符串时,PHP会自动将非字符串的值转换为字符串
echo $number . "\n";
}
输出结果:
1
2
3
4
5
6
7
8
9
10
方法2:
c
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
foreach ($numbers as $num) {
echo $num . PHP_EOL; // PHP_EOL 是跨平台的换行符
}
动态生成数组
c
// 使用循环创建数组
$numbers = [];
for ($i = 1; $i <= 10; $i++) {
$numbers[] = $i; // 将数字添加到数组末尾
}
// 打印结果
foreach ($numbers as $index => $value) {
echo "索引 {$index} 的值是: {$value}\n";
}
索引 0 的值是: 1
索引 1 的值是: 2
索引 2 的值是: 3
索引 3 的值是: 4
索引 4 的值是: 5
索引 5 的值是: 6
索引 6 的值是: 7
索引 7 的值是: 8
索引 8 的值是: 9
索引 9 的值是: 10
单行打印:
c
$numbers = range(1, 10);
foreach ($numbers as $number) {
echo $number . " "; // 用空格分隔
}
// 输出: 1 2 3 4 5 6 7 8 9 10
in_array
bool in_array(mixed needle, array haystack [, bool $strict = false])
-
$needle:要搜索的值(任意类型)。
-
$haystack:被搜索的数组。
-
$strict(可选):是否启用严格模式(默认 false)。若为 true,则同时比较值和类型。
-
返回值:
找到值返回 true,否则返回 false。
基础使用
c
$arr = [1, 2, "3", "apple"];
var_dump(in_array(2, $arr)); // true(数字2存在)
var_dump(in_array("2", $arr)); // true(字符串"2"被转换为数字2)
var_dump(in_array("apple", $arr)); // true(字符串存在)
var_dump(in_array("banana", $arr));// false
严格使用
c
$arr = [1, 2, "3", "apple"];
var_dump(in_array("2", $arr, true)); // false(类型不同)
var_dump(in_array("3", $arr, true)); // true(值+类型匹配)
var_dump(in_array(3, $arr, true)); // false(数字3 ≠ 字符串"3")