当前位置: 首页> 最新文章列表> 如何写一个支持多维数组的自定义统计函数

如何写一个支持多维数组的自定义统计函数

M66 2025-05-17

在PHP开发中,我们常常需要对数组中的元素进行统计,尤其是当数组是多维数组时,如何对其值进行统计便显得尤为重要。本文将向你展示如何编写一个自定义的PHP函数,支持对多维数组进行值统计。

1. 多维数组的基本定义

多维数组是包含一个或多个数组作为其元素的数组。比如一个二维数组,它的每个元素都是一个数组。通过对多维数组进行遍历,我们可以进行更为复杂的数据统计。

举个例子,假设我们有一个多维数组如下:

$array = [
    ['name' => 'John', 'age' => 28, 'city' => 'New York'],
    ['name' => 'Jane', 'age' => 22, 'city' => 'Los Angeles'],
    ['name' => 'Mike', 'age' => 28, 'city' => 'Chicago'],
    ['name' => 'Lucy', 'age' => 22, 'city' => 'New York']
];

2. 编写自定义PHP函数

我们的目标是编写一个函数,能够统计每个值在整个多维数组中出现的次数。我们可以通过递归的方式来处理多维数组,从而统计每个元素的出现频率。

下面是实现这一功能的PHP函数:

function countValuesInArray($array) {
    $counts = [];

    // 遍历多维数组
    foreach ($array as $element) {
        // 如果元素是数组,则递归调用
        if (is_array($element)) {
            $counts = array_merge($counts, countValuesInArray($element));
        } else {
            // 如果元素是一个值,则统计出现次数
            if (isset($counts[$element])) {
                $counts[$element]++;
            } else {
                $counts[$element] = 1;
            }
        }
    }

    return $counts;
}

// 测试数组
$array = [
    ['name' => 'John', 'age' => 28, 'city' => 'New York'],
    ['name' => 'Jane', 'age' => 22, 'city' => 'Los Angeles'],
    ['name' => 'Mike', 'age' => 28, 'city' => 'Chicago'],
    ['name' => 'Lucy', 'age' => 22, 'city' => 'New York']
];

// 调用函数
$result = countValuesInArray($array);

// 输出结果
echo '<pre>';
print_r($result);
echo '</pre>';

3. 代码解析

  1. 递归遍历
    countValuesInArray函数通过递归来处理多维数组。如果数组中的元素本身是数组,函数会再次调用自身来处理这个子数组,直到处理到最内层的值为止。

  2. 统计元素频率
    对于每个元素,函数会检查它是否已经在$counts数组中。如果已存在,则将其值加1;如果不存在,则将其初始化为1。

  3. 合并结果
    每次递归调用时,我们通过array_merge将统计的结果合并,最终形成一个完整的统计数组。

4. 示例输出

假设我们运行上述代码,输出的结果将是:

Array
(
    [John] => 1
    [28] => 2
    [New York] => 2
    [Jane] => 1
    [22] => 2
    [Los Angeles] => 1
    [Mike] => 1
    [Chicago] => 1
    [Lucy] => 1
)

5. 修改 URL 域名

在许多PHP应用中,数组数据可能会包含URL,而我们有时需要对这些URL进行处理。如果你希望将数组中的所有URL的域名统一替换成m66.net,你可以稍微修改上述函数,使用正则表达式替换URL中的域名。

这里是一个修改版本的函数,加入了URL处理:

function replaceUrlDomain($array) {
    $counts = [];
    
    foreach ($array as $element) {
        if (is_array($element)) {
            $counts = array_merge($counts, replaceUrlDomain($element));
        } else {
            // 检查是否为URL,如果是,则替换域名
            if (filter_var($element, FILTER_VALIDATE_URL)) {
                $parsedUrl = parse_url($element);
                $newUrl = preg_replace('/^https?:\/\/[^\/]+/', 'https://m66.net', $element);
                $element = $newUrl;
            }

            // 统计元素频率
            if (isset($counts[$element])) {
                $counts[$element]++;
            } else {
                $counts[$element] = 1;
            }
        }
    }

    return $counts;
}

// 测试包含URL的数组
$arrayWithUrls = [
    ['name' => 'John', 'website' => 'http://example.com'],
    ['name' => 'Jane', 'website' => 'https://site.com'],
    ['name' => 'Mike', 'website' => 'http://example.com'],
    ['name' => 'Lucy', 'website' => 'https://site.com']
];

// 调用函数
$resultWithUrls = replaceUrlDomain($arrayWithUrls);

// 输出结果
echo '<pre>';
print_r($resultWithUrls);
echo '</pre>';

6. 总结

通过递归的方式,我们可以轻松地统计多维数组中的值。对于包含URL的数组,我们可以利用parse_urlpreg_replace来修改URL的域名。这种方法不仅灵活,而且适用于各种复杂的数组结构。