求助:如何用PHP从一维数组中获取最长及第二长字符串?
修正PHP函数
findLongestStringFromArray以获取最长与第二长字符串 嘿,我来帮你搞定这个函数!你的思路其实没问题,但代码里有几个小坑导致无法正常工作:
next($maxLength)完全用错地方了——$maxLength是单个数值(最长字符串的长度),next()是用来移动数组指针的,用在单个值上根本不起作用- 没考虑多个字符串长度相同的情况(比如有两个长度一样的最长字符串)
- 仅用
array_search找键值的话,只能拿到第一个匹配的元素,没法处理重复长度的场景
下面是修正后的完整代码,同时兼顾了各种边界情况,逻辑也更清晰:
function findLongestStringFromArray($array = array()) { // 先校验数组有效性:空数组或包含非字符串元素直接返回提示 if (empty($array) || !allElementsAreStrings($array)) { return [ 'longest_string' => null, 'second_longest_string' => null, 'message' => '数组为空或包含非字符串元素,请检查输入' ]; } // 给每个字符串绑定长度,保留原内容 $lengthMapped = array_map(function($str) { return [ 'value' => $str, 'length' => strlen($str) ]; }, $array); // 按字符串长度降序排序,长度相同则保留原数组中的顺序 usort($lengthMapped, function($a, $b) { return $b['length'] - $a['length']; }); // 获取最长字符串 $longest = $lengthMapped[0]['value']; $longestLength = $lengthMapped[0]['length']; // 获取第二长字符串——这里分两种场景,你可以按需选择 // 场景1:取"次长"(长度严格小于最长的第一个元素) $secondLongest = null; foreach ($lengthMapped as $item) { if ($item['length'] < $longestLength) { $secondLongest = $item['value']; break; } } // 如果所有元素长度都一样,第二长就和最长相同 if ($secondLongest === null) { $secondLongest = $longest; } // 场景2:取"排名第二的最长"(哪怕和最长长度相同,只要是排序后的第二个元素) // $secondLongest = isset($lengthMapped[1]) ? $lengthMapped[1]['value'] : $longest; $secondLongestLength = strlen($secondLongest); return [ 'longest_string' => $longest, 'longest_length' => $longestLength, 'second_longest_string' => $secondLongest, 'second_longest_length' => $secondLongestLength ]; } // 辅助函数:检查数组所有元素是否为字符串类型 function allElementsAreStrings($array) { foreach ($array as $item) { if (!is_string($item)) { return false; } } return true; }
代码说明:
- 新增了输入校验,避免空数组或非字符串元素导致的报错
- 用
array_map给每个字符串绑定长度,后续排序和取值更方便 - 用
usort自定义排序规则,确保按长度从大到小排列,长度相同的元素保留原顺序 - 提供了两种获取第二长字符串的逻辑,你可以根据实际需求注释/取消注释切换:
- 场景1适合需要严格区分"最长"和"次长"的情况
- 场景2适合只要取前两个最长(不管长度是否相同)的情况
测试示例:
// 测试普通场景 $testArr1 = ["apple", "banana", "cherry", "date"]; print_r(findLongestStringFromArray($testArr1)); // 场景1输出:最长是banana(6),第二长是date(4) // 场景2输出:最长是banana(6),第二长是cherry(6) // 测试所有元素长度相同的场景 $testArr2 = ["cat", "dog", "pig"]; print_r(findLongestStringFromArray($testArr2)); // 两种场景输出都是:最长和第二长都是cat(或dog/pig,取决于原数组顺序)
内容的提问来源于stack exchange,提问作者NextZuck
相关产品推荐
相关产品推荐

