You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同结构多数组键值一致性判断及数组重组技术问询

解决你的两个PHP数组处理需求

没问题,我来帮你搞定这两个PHP数组处理的需求,一步步给你拆解解决方案!

一、判断指定键的键值是否存在重复

要检查多组同结构数组里某个指定键的重复值,核心思路就是先把所有目标键的值收集起来,然后判断是否有重复项。这里给你两种实用的实现方式:

快速判断是否存在重复

如果只需要知道有没有重复,可以在遍历过程中实时检查,一旦发现重复就立即返回结果,效率更高:

function hasDuplicateValues($arrays, $targetKey) {
    $collectedValues = [];
    foreach ($arrays as $subArray) {
        // 先确保子数组包含目标键,避免报错
        if (!isset($subArray[$targetKey])) {
            continue; // 或者根据你的业务需求抛出异常
        }
        $currentValue = $subArray[$targetKey];
        if (in_array($currentValue, $collectedValues)) {
            return true; // 发现重复,直接返回true
        }
        $collectedValues[] = $currentValue;
    }
    return false; // 遍历完没找到重复
}

// 测试示例
$testData = [
    ['name' => 'POST', 'value' => 'lorem ipsum 1'],
    ['name' => 'POST', 'value' => 'lorem ipsum 2'],
    ['name' => 'NOT_POST', 'value' => 'lorem ipsum 1'], // 这里value和第一个重复了
];
var_dump(hasDuplicateValues($testData, 'value')); // 输出 bool(true)

获取所有重复的键值

如果需要知道具体哪些值重复了,可以统计每个值的出现次数,再筛选出次数大于1的:

function getDuplicateValues($arrays, $targetKey) {
    $valueCount = [];
    foreach ($arrays as $subArray) {
        if (isset($subArray[$targetKey])) {
            $val = $subArray[$targetKey];
            $valueCount[$val] = isset($valueCount[$val]) ? $valueCount[$val] + 1 : 1;
        }
    }
    // 筛选出出现次数超过1的值
    return array_filter($valueCount, function($count) {
        return $count > 1;
    });
}

// 测试示例
print_r(getDuplicateValues($testData, 'value'));
// 输出:Array ( [lorem ipsum 1] => 2 )

二、数组重组为目标结构

针对你给出的示例,我们可以通过遍历原数组,按name键分组,再整理value的结构。这里分两种情况实现:

完全匹配你期望的结构

示例中单个元素的NOT_POST是直接的关联数组,多个元素的POST是包含多个关联数组的数组,代码实现如下:

$array = [ 
    ['name' => 'POST', 'value' => 'lorem ipsum 1'], 
    ['name' => 'POST', 'value' => 'lorem ipsum 2'], 
    ['name' => 'NOT_POST', 'value' => 'lorem ipsum 3'], 
];

$resultingArray = [];
foreach ($array as $item) {
    $name = $item['name'];
    $valueItem = ['value' => $item['value']];
    
    if (isset($resultingArray[$name])) {
        // 如果该name已存在,先判断当前存储的是单个元素还是数组,转为数组再追加
        if (!is_array($resultingArray[$name]) || isset($resultingArray[$name]['value'])) {
            $resultingArray[$name] = [$resultingArray[$name]];
        }
        $resultingArray[$name][] = $valueItem;
    } else {
        // 首次出现,先存为单个关联数组
        $resultingArray[$name] = $valueItem;
    }
}

print_r($resultingArray);

运行后会得到你想要的结果:

Array
(
    [POST] => Array
        (
            [0] => Array
                (
                    [value] => lorem ipsum 1
                )

            [1] => Array
                (
                    [value] => lorem ipsum 2
                )

        )

    [NOT_POST] => Array
        (
            [value] => lorem ipsum 3
        )

)

更规范的统一数组结构(推荐)

其实这种“单个元素是关联数组,多个是数组”的结构,后续处理时容易出现类型判断的问题。更推荐统一用数组包裹所有元素,不管数量多少,代码也更简洁:

$resultingArray = [];
foreach ($array as $item) {
    $name = $item['name'];
    // 如果该name还没初始化,先创建一个空数组
    if (!isset($resultingArray[$name])) {
        $resultingArray[$name] = [];
    }
    // 直接追加value结构
    $resultingArray[$name][] = ['value' => $item['value']];
}

print_r($resultingArray);

结果如下,后续遍历或操作时不用再判断类型,更稳定:

Array
(
    [POST] => Array
        (
            [0] => Array
                (
                    [value] => lorem ipsum 1
                )

            [1] => Array
                (
                    [value] => lorem ipsum 2
                )

        )

    [NOT_POST] => Array
        (
            [0] => Array
                (
                    [value] => lorem ipsum 3
                )

        )

)

内容的提问来源于stack exchange,提问作者aborted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:16:43