同结构多数组键值一致性判断及数组重组技术问询
解决你的两个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
相关产品推荐
相关产品推荐

