PHP数组

数组是PHP中一种非常重要的数据结构,用于存储多个值。PHP支持三种类型的数组:索引数组(带有数字索引)、关联数组(带有命名键)和多维数组(包含一个或多个数组的数组)。本教程将详细介绍PHP数组的定义、操作和常用函数。

PHP数组的定义

在PHP中,有多种方式定义数组:

1. 使用array()函数

<?php
// 索引数组
$cars = array("Volvo", "BMW", "Toyota");

// 关联数组
$age = array("Peter" => 35, "Ben" => 37, "Joe" => 43);
?>

2. 使用方括号语法(PHP 5.4+)

<?php
// 索引数组
$cars = ["Volvo", "BMW", "Toyota"];

// 关联数组
$age = ["Peter" => 35, "Ben" => 37, "Joe" => 43];
?>

3. 逐个添加元素

<?php
// 索引数组
$cars[0] = "Volvo";
$cars[1] = "BMW";
$cars[2] = "Toyota";

// 关联数组
$age["Peter"] = 35;
$age["Ben"] = 37;
$age["Joe"] = 43;
?>

PHP索引数组

索引数组是使用数字作为键的数组。PHP会自动为索引数组分配数字索引,索引从0开始。

<?php
// 创建索引数组
$colors = array("Red", "Green", "Blue");

// 访问索引数组元素
 echo $colors[0]; // 输出: Red
 echo $colors[1]; // 输出: Green
 echo $colors[2]; // 输出: Blue

// 遍历索引数组
for ($i = 0; $i < count($colors); $i++) {
    echo $colors[$i] . "<br>";
}

// 使用foreach遍历索引数组
foreach ($colors as $color) {
    echo $color . "<br>";
}
?>

PHP关联数组

关联数组是使用命名键的数组,可以为每个元素指定一个有意义的键名。

<?php
// 创建关联数组
$student = array(
    "name" => "John Doe",
    "age" => 25,
    "email" => "john@example.com",
    "course" => "Computer Science"
);

// 访问关联数组元素
 echo $student["name"]; // 输出: John Doe
 echo $student["age"]; // 输出: 25
 echo $student["email"]; // 输出: john@example.com

// 遍历关联数组
foreach ($student as $key => $value) {
    echo "$key: $value<br>";
}
?>

PHP多维数组

多维数组是包含一个或多个数组的数组。PHP支持二维、三维和更高维的数组。

1. 二维数组

<?php
// 创建二维数组(学生信息列表)
$students = array(
    array("name" => "John", "age" => 22, "grade" => "A"),
    array("name" => "Mary", "age" => 21, "grade" => "B"),
    array("name" => "Peter", "age" => 23, "grade" => "C")
);

// 访问二维数组元素
 echo $students[0]["name"]; // 输出: John
 echo $students[1]["age"]; // 输出: 21
 echo $students[2]["grade"]; // 输出: C

// 遍历二维数组
for ($i = 0; $i < count($students); $i++) {
    echo "学生 " . ($i + 1) . " 信息:<br>";
    foreach ($students[$i] as $key => $value) {
        echo "$key: $value<br>";
    }
    echo "<br>";
}
?>

2. 三维数组

<?php
// 创建三维数组(学生成绩表)
$grades = array(
    "class1" => array(
        "John" => array("math" => 85, "english" => 92, "science" => 78),
        "Mary" => array("math" => 90, "english" => 88, "science" => 95)
    ),
    "class2" => array(
        "Peter" => array("math" => 75, "english" => 80, "science" => 85),
        "Lisa" => array("math" => 92, "english" => 94, "science" => 88)
    )
);

// 访问三维数组元素
 echo $grades["class1"]["John"]["math"]; // 输出: 85
 echo $grades["class2"]["Lisa"]["english"]; // 输出: 94

// 遍历三维数组
foreach ($grades as $class => $students) {
    echo "$class 成绩表:<br>";
    foreach ($students as $student => $scores) {
        echo "$student 的成绩:<br>";
        foreach ($scores as $subject => $score) {
            echo "$subject: $score<br>";
        }
        echo "<br>";
    }
    echo "<br>";
}
?>

PHP数组操作

PHP提供了丰富的数组操作函数,可以方便地添加、删除、修改和查询数组元素。

1. 添加元素

<?php
// 索引数组添加元素
$colors = array("Red", "Green");
$colors[] = "Blue"; // 添加到数组末尾
$colors[3] = "Yellow"; // 指定索引位置添加

// 关联数组添加元素
$person = array("name" => "John", "age" => 25);
$person["email"] = "john@example.com";
$person["address"] = "123 Main St";
?>

2. 修改元素

<?php
// 修改索引数组元素
$colors = array("Red", "Green", "Blue");
$colors[1] = "Light Green";

// 修改关联数组元素
$person = array("name" => "John", "age" => 25);
$person["age"] = 26;
?>

3. 删除元素

<?php
// 删除索引数组元素
$colors = array("Red", "Green", "Blue");
unset($colors[1]); // 删除索引为1的元素

// 删除关联数组元素
$person = array("name" => "John", "age" => 25, "email" => "john@example.com");
unset($person["email"]);

// 删除所有数组元素
$colors = array("Red", "Green", "Blue");
unset($colors); // 删除整个数组
?>

4. 合并数组

<?php
// 合并两个索引数组
$colors1 = array("Red", "Green");
$colors2 = array("Blue", "Yellow");
$merged_colors = array_merge($colors1, $colors2);

// 合并两个关联数组
$person1 = array("name" => "John", "age" => 25);
$person2 = array("email" => "john@example.com", "address" => "123 Main St");
$merged_person = array_merge($person1, $person2);

// 合并有相同键的关联数组
$array1 = array("a" => "red", "b" => "green");
$array2 = array("b" => "blue", "c" => "yellow");
$merged_array = array_merge($array1, $array2); // 结果: array("a" => "red", "b" => "blue", "c" => "yellow")
?>

5. 数组长度

<?php
$colors = array("Red", "Green", "Blue");
$length = count($colors); // 获取数组长度,结果: 3
?>

6. 数组排序

<?php
// 索引数组排序
$numbers = array(4, 2, 8, 6, 1);
sort($numbers); // 升序排序,结果: array(1, 2, 4, 6, 8)
rsort($numbers); // 降序排序,结果: array(8, 6, 4, 2, 1)

// 关联数组按键排序
$ages = array("Peter" => 35, "Ben" => 37, "Joe" => 43);
ksort($ages); // 按键升序排序,结果: array("Ben" => 37, "Joe" => 43, "Peter" => 35)
krsort($ages); // 按键降序排序,结果: array("Peter" => 35, "Joe" => 43, "Ben" => 37)

// 关联数组按值排序
$ages = array("Peter" => 35, "Ben" => 37, "Joe" => 43);
asort($ages); // 按值升序排序,结果: array("Peter" => 35, "Ben" => 37, "Joe" => 43)
arsort($ages); // 按值降序排序,结果: array("Joe" => 43, "Ben" => 37, "Peter" => 35)
?>

PHP数组函数

PHP提供了大量的数组函数,可以用于各种数组操作。以下是一些常用的数组函数:

函数 描述
array() 创建数组
array_change_key_case() 将数组中的所有键更改为大写或小写
array_chunk() 将数组分割成多个数组
array_column() 从多维数组中返回单列
array_combine() 通过合并两个数组来创建一个新数组
array_count_values() 统计数组中所有值出现的次数
array_diff() 计算数组的差集
array_diff_assoc() 使用键名和键值比较计算数组的差集
array_diff_key() 使用键名比较计算数组的差集
array_diff_uassoc() 带用户自定义函数的键名和键值比较
array_diff_ukey() 带用户自定义函数的键名比较
array_fill() 用给定的值填充数组
array_fill_keys() 用指定的键和值填充数组
array_filter() 用回调函数过滤数组中的元素
array_flip() 交换数组中的键和值
array_intersect() 计算数组的交集
array_intersect_assoc() 使用键名和键值比较计算数组的交集
array_intersect_key() 使用键名比较计算数组的交集
array_intersect_uassoc() 带用户自定义函数的键名和键值比较
array_intersect_ukey() 带用户自定义函数的键名比较
array_key_exists() 检查数组中是否存在指定的键
array_keys() 返回数组中所有的键
array_map() 将回调函数作用到数组中的每个元素上
array_merge() 合并一个或多个数组
array_merge_recursive() 递归地合并一个或多个数组
array_multisort() 对多个数组或多维数组进行排序
array_pad() 用值将数组填补到指定长度
array_pop() 删除数组中的最后一个元素
array_product() 计算数组中所有值的乘积
array_push() 将一个或多个元素压入数组的末尾
array_rand() 从数组中随机选出一个或多个键
array_reduce() 用回调函数迭代地将数组简化为单个值
array_replace() 用后面数组的值替换第一个数组的值
array_replace_recursive() 递归地用后面数组的值替换第一个数组的值
array_reverse() 将数组中的元素顺序反转
array_search() 在数组中搜索给定的值,如果找到则返回键名
array_shift() 删除并返回数组中的第一个元素
array_slice() 从数组中取出一段
array_splice() 删除数组中的一部分元素,并可以用新元素替代它们
array_sum() 计算数组中所有值的和
array_udiff() 用回调函数比较数据来计算数组的差集
array_udiff_assoc() 带索引检查的数组差集,用回调函数比较数据
array_udiff_uassoc() 带索引检查的数组差集,用回调函数比较数据和索引
array_uintersect() 计算数组的交集,用回调函数比较数据
array_uintersect_assoc() 带索引检查的数组交集,用回调函数比较数据
array_uintersect_uassoc() 带索引检查的数组交集,用回调函数比较数据和索引
array_unique() 移除数组中的重复值
array_unshift() 在数组的开头插入一个或多个元素
array_values() 返回数组中所有的值
array_walk() 对数组中的每个元素应用用户自定义函数
array_walk_recursive() 递归地对数组中的每个元素应用用户自定义函数
arsort() 对关联数组按照键值进行降序排序
asort() 对关联数组按照键值进行升序排序
compact() 创建一个包含变量名和它们的值的数组
count() 计算数组中的元素数目
current() 返回数组中的当前元素
each() 返回数组中当前的键/值对并将数组指针向前移动一步
end() 将数组的内部指针指向最后一个元素
extract() 从数组中将变量导入到当前的符号表
in_array() 检查数组中是否存在某个值
key() 从关联数组中取得键名
krsort() 对关联数组按照键名进行降序排序
ksort() 对关联数组按照键名进行升序排序
list() 把数组中的值赋给一组变量
natcasesort() 用自然排序算法对数组进行不区分大小写的排序
natsort() 用自然排序算法对数组排序
next() 将数组中的内部指针向前移动一位
prev() 将数组中的内部指针倒回一位
range() 创建一个包含指定范围的元素的数组
reset() 将数组的内部指针指向第一个元素
rsort() 对索引数组按照值进行降序排序
shuffle() 打乱数组
sizeof() count()的别名
sort() 对索引数组按照值进行升序排序
uasort() 使用用户自定义的比较函数对数组进行排序并保持索引关联
uksort() 使用用户自定义的比较函数对数组按照键名排序
usort() 使用用户自定义的比较函数对数组进行排序

PHP数组的最佳实践

  1. 选择合适的数组类型:根据需要存储的数据类型和访问方式,选择索引数组或关联数组。
  2. 使用方括号语法:在PHP 5.4及以上版本中,使用方括号语法($array = [1, 2, 3];)来定义数组,更加简洁易读。
  3. 使用有意义的键名:在关联数组中,使用有意义的键名可以提高代码的可读性和可维护性。
  4. 避免过深的多维数组:尽量避免使用过深的多维数组,这会使代码难以理解和维护。
  5. 使用数组函数:PHP提供了丰富的数组函数,合理使用这些函数可以简化代码并提高效率。
  6. 检查数组元素是否存在:在访问数组元素之前,使用array_key_exists()或isset()函数检查元素是否存在,以避免产生警告。
  7. 使用foreach循环遍历数组:foreach循环是遍历数组的最简洁和最高效的方式。
  8. 使用类型声明:在PHP 7及以上版本中,可以使用类型声明来确保数组的类型安全。

PHP数组综合示例

<?php
// 1. 索引数组示例

echo "<h4>1. 索引数组示例</h4>";

// 创建索引数组
$languages = array("PHP", "JavaScript", "Python", "Java", "C++");

// 访问数组元素
echo "第一个编程语言: " . $languages[0] . "<br>";
echo "第二个编程语言: " . $languages[1] . "<br>";

// 修改数组元素
$languages[2] = "Ruby";
echo "修改后的第三个编程语言: " . $languages[2] . "<br>";

// 添加新元素
$languages[] = "Go";
echo "数组的新长度: " . count($languages) . "<br>";
echo "最后添加的编程语言: " . end($languages) . "<br>";

// 遍历数组
echo "<h5>所有编程语言:</h5>";
foreach ($languages as $language) {
    echo $language . "<br>";
}

echo "<br><br>";

// 2. 关联数组示例

echo "<h4>2. 关联数组示例</h4>";

// 创建关联数组
$book = array(
    "title" => "PHP Programming",
    "author" => "John Smith",
    "publisher" => "Tech Books",
    "year" => 2020,
    "price" => 49.99
);

// 访问数组元素
echo "书名: " . $book["title"] . "<br>";
echo "作者: " . $book["author"] . "<br>";
echo "价格: $" . $book["price"] . "<br>";

// 修改数组元素
$book["price"] = 39.99;
echo "修改后的价格: $" . $book["price"] . "<br>";

// 添加新元素
$book["rating"] = 4.5;
echo "添加的评分: " . $book["rating"] . "<br>";

// 遍历关联数组
echo "<h5>图书信息:</h5>";
foreach ($book as $key => $value) {
    echo "$key: $value<br>";
}

echo "<br><br>";

// 3. 多维数组示例

echo "<h4>3. 多维数组示例</h4>";

// 创建二维数组
$employees = array(
    array("id" => 1, "name" => "John Doe", "department" => "HR", "salary" => 50000),
    array("id" => 2, "name" => "Jane Smith", "department" => "IT", "salary" => 60000),
    array("id" => 3, "name" => "Mike Johnson", "department" => "Finance", "salary" => 55000),
    array("id" => 4, "name" => "Lisa Davis", "department" => "Marketing", "salary" => 48000)
);

// 访问多维数组元素
echo "第一个员工姓名: " . $employees[0]["name"] . "<br>";
echo "第三个员工部门: " . $employees[2]["department"] . "<br>";

// 遍历二维数组
echo "<h5>员工信息表:</h5>";
echo "<table border='1' cellspacing='0' cellpadding='5'>";
echo "<tr><th>ID</th><th>姓名</th><th>部门</th><th>薪资</th></tr>";

foreach ($employees as $employee) {
    echo "<tr>";
    echo "<td>" . $employee["id"] . "</td>";
    echo "<td>" . $employee["name"] . "</td>";
    echo "<td>" . $employee["department"] . "</td>";
    echo "<td>$" . $employee["salary"] . "</td>";
    echo "</tr>";
}

echo "</table>";

echo "<br><br>";

// 4. 数组函数示例

echo "<h4>4. 数组函数示例</h4>";

// 数组排序
$numbers = array(5, 2, 8, 1, 9, 3);
echo "原始数组: " . implode(", ", $numbers) . "<br>";

sort($numbers);
echo "升序排序: " . implode(", ", $numbers) . "<br>";

rsort($numbers);
echo "降序排序: " . implode(", ", $numbers) . "<br>";

echo "<br>";

// 数组搜索
$fruits = array("apple", "banana", "orange", "grape", "mango");
$search_fruit = "orange";

if (in_array($search_fruit, $fruits)) {
    echo "$search_fruit 在数组中,索引为: " . array_search($search_fruit, $fruits) . "<br>";
} else {
    echo "$search_fruit 不在数组中";
}

echo "<br>";

// 数组过滤
$ages = array(18, 25, 30, 16, 14, 21, 40);
$adult_ages = array_filter($ages, function($age) {
    return $age >= 18;
});

echo "所有年龄: " . implode(", ", $ages) . "<br>";
echo "成年人年龄: " . implode(", ", $adult_ages) . "<br>";

echo "<br>";

// 数组合并
$array1 = array("a", "b", "c");
$array2 = array("d", "e", "f");
$merged_array = array_merge($array1, $array2);

echo "数组1: " . implode(", ", $array1) . "<br>";
echo "数组2: " . implode(", ", $array2) . "<br>";
echo "合并后的数组: " . implode(", ", $merged_array) . "<br>";

echo "<br>";

// 数组映射
$numbers = array(1, 2, 3, 4, 5);
$squared_numbers = array_map(function($number) {
    return $number * $number;
}, $numbers);

echo "原始数组: " . implode(", ", $numbers) . "<br>";
echo "平方后的数组: " . implode(", ", $squared_numbers) . "<br>";

echo "<br><br>";

// 5. 实际应用示例

echo "<h4>5. 实际应用示例</h4>";

// 示例1: 统计单词频率
function count_words($text) {
    // 转换为小写并替换非字母数字字符
    $text = strtolower($text);
    $text = preg_replace('/[^a-z0-9 ]/', '', $text);
    
    // 拆分为单词数组
    $words = explode(' ', $text);
    
    // 移除空元素
    $words = array_filter($words);
    
    // 统计频率
    $word_counts = array_count_values($words);
    
    // 按频率排序
    arsort($word_counts);
    
    return $word_counts;
}

// 测试单词频率统计
$text = "PHP is a popular general-purpose scripting language that is especially suited to web development. PHP is known for its simplicity and flexibility. PHP can be embedded into HTML.";
$word_counts = count_words($text);

// 显示结果
echo "<h5>单词频率统计:</h5>";
foreach ($word_counts as $word => $count) {
    echo "$word: $count 次<br>";
}

echo "<br>";

// 示例2: 计算数组的统计信息
function array_stats($array) {
    $stats = array();
    $stats["count"] = count($array);
    $stats["sum"] = array_sum($array);
    $stats["average"] = $stats["sum"] / $stats["count"];
    $stats["min"] = min($array);
    $stats["max"] = max($array);
    
    // 排序数组以计算中位数
    sort($array);
    $middle = floor($stats["count"] / 2);
    if ($stats["count"] % 2 == 0) {
        $stats["median"] = ($array[$middle-1] + $array[$middle]) / 2;
    } else {
        $stats["median"] = $array[$middle];
    }
    
    // 计算众数
    $values = array_count_values($array);
    $max_count = max($values);
    $modes = array_keys($values, $max_count);
    $stats["mode"] = $modes[0];
    
    return $stats;
}

// 测试数组统计信息
$scores = array(85, 92, 78, 90, 85, 95, 88, 90, 85, 92);
$stats = array_stats($scores);

// 显示结果
echo "<h5>数组统计信息:</h5>";
echo "数组元素: " . implode(", ", $scores) . "<br>";
echo "元素数量: " . $stats["count"] . "<br>";
echo "总和: " . $stats["sum"] . "<br>";
echo "平均值: " . $stats["average"] . "<br>";
echo "最小值: " . $stats["min"] . "<br>";
echo "最大值: " . $stats["max"] . "<br>";
echo "中位数: " . $stats["median"] . "<br>";
echo "众数: " . $stats["mode"] . "<br>";

echo "<br>";

// 示例3: 构建导航菜单
function build_nav_menu($items) {
    $menu = "<ul>\n";
    
    foreach ($items as $key => $item) {
        $menu .= "    <li>\n";
        
        if (is_array($item)) {
            // 有子菜单
            $menu .= "        <a href='#'>$key</a>\n";
            $menu .= "        <ul>\n";
            
            foreach ($item as $sub_key => $sub_item) {
                $menu .= "            <li><a href='{$sub_item}'>$sub_key</a></li>\n";
            }
            
            $menu .= "        </ul>\n";
        } else {
            // 无子菜单
            $menu .= "        <a href='{$item}'>$key</a>\n";
        }
        
        $menu .= "    </li>\n";
    }
    
    $menu .= "</ul>";
    
    return $menu;
}

// 测试导航菜单构建
$nav_items = array(
    "首页" => "index.html",
    "产品" => array(
        "智能手机" => "products/smartphones.html",
        "笔记本电脑" => "products/laptops.html",
        "平板电脑" => "products/tablets.html"
    ),
    "关于我们" => "about.html",
    "联系我们" => "contact.html"
);

// 显示导航菜单
echo "<h5>导航菜单示例:</h5>";
echo build_nav_menu($nav_items);

// 示例4: 处理表单数据
function process_form_data($form_data) {
    // 过滤和清理表单数据
    $clean_data = array();
    
    foreach ($form_data as $key => $value) {
        // 移除首尾空白字符
        $clean_value = trim($value);
        // 转义特殊字符
        $clean_value = htmlspecialchars($clean_value);
        // 存储清理后的数据
        $clean_data[$key] = $clean_value;
    }
    
    return $clean_data;
}

// 测试表单数据处理(模拟表单数据)
$form_data = array(
    "name" => " John Doe ",
    "email" => "john@example.com",
    "message" => "Hello, this is a test message! <script>alert('XSS')</script>"
);

$clean_data = process_form_data($form_data);

// 显示结果
echo "<br><h5>表单数据处理:</h5>";
echo "原始数据:<br>";
echo "<pre>". print_r($form_data, true) ."</pre><br>";
echo "清理后的数据:<br>";
echo "<pre>". print_r($clean_data, true) ."</pre><br>";

// 示例5: 构建查询字符串
function build_query_string($params) {
    $query_string = "";
    $first = true;
    
    foreach ($params as $key => $value) {
        if ($first) {
            $query_string .= "?";
            $first = false;
        } else {
            $query_string .= "&";
        }
        
        $query_string .= urlencode($key) . "=" . urlencode($value);
    }
    
    return $query_string;
}

// 测试查询字符串构建
$query_params = array(
    "page" => 1,
    "sort" => "name",
    "order" => "asc",
    "search" => "PHP教程"
);

$query_string = build_query_string($query_params);

echo "<h5>查询字符串示例:</h5>";
echo "查询参数: <pre>". print_r($query_params, true) ."</pre><br>";
echo "生成的查询字符串: " . $query_string . "<br><br>";
?>