PHP:获取关联数组中值相同且键字符串最长的元素
解决PHP数组中保留值相同且键名最长元素的问题
你的现有代码已经成功筛选出了值重复的元素,但还缺少关键一步——对每个值相同的键集合,挑选出键名最长的那个。这里给你两种贴合需求的实现方案:
方案一:仅保留值重复的最长键(完全匹配你的期望)
这个方案和你原代码的过滤逻辑对齐,只处理值出现多次的元素组:
<?php $data = array('Anna' => 1, 'Ann' => 1, 'Tommy' => 100, 'Tom' => 100); // 第一步:按值分组,把相同值的键归集到一起 $groupedByValue = []; foreach ($data as $key => $value) { $groupedByValue[$value][] = $key; } $filtered = []; foreach ($groupedByValue as $value => $keys) { // 只处理值重复出现的组 if (count($keys) <= 1) { continue; } // 遍历键数组,找出长度最长的那个键 $longestKey = array_reduce($keys, function ($currentLongest, $key) { return strlen($key) > strlen($currentLongest) ? $key : $currentLongest; }, $keys[0]); $filtered[$longestKey] = $value; } print_r($filtered); ?>
方案二:保留所有值对应的最长键(包含唯一值元素)
如果需要保留所有值对应的最长键(不管值是否重复),可以去掉值重复的判断:
<?php $data = array('Anna' => 1, 'Ann' => 1, 'Tommy' => 100, 'Tom' => 100); $groupedByValue = []; foreach ($data as $key => $value) { $groupedByValue[$value][] = $key; } $filtered = []; foreach ($groupedByValue as $value => $keys) { $longestKey = array_reduce($keys, function ($currentLongest, $key) { return strlen($key) > strlen($currentLongest) ? $key : $currentLongest; }, $keys[0]); $filtered[$longestKey] = $value; } print_r($filtered); ?>
输出结果
两种方案(方案一完全匹配你的需求)都会输出:
Array ( [Anna] => 1 [Tommy] => 100 )
逻辑说明
- 按值分组:遍历原数组,把拥有相同值的键放到同一个集合里,这样就能针对每个值对应的键组单独处理。
- 筛选最长键:用
array_reduce逐个比较键的长度,最终留下当前组里最长的键,再将它和对应的值存入结果数组。
内容的提问来源于stack exchange,提问作者jiten2015
相关产品推荐
相关产品推荐

