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

求助:如何用PHP从一维数组中获取最长及第二长字符串?

修正PHP函数findLongestStringFromArray以获取最长与第二长字符串

嘿,我来帮你搞定这个函数!你的思路其实没问题,但代码里有几个小坑导致无法正常工作:

  1. next($maxLength)完全用错地方了——$maxLength是单个数值(最长字符串的长度),next()是用来移动数组指针的,用在单个值上根本不起作用
  2. 没考虑多个字符串长度相同的情况(比如有两个长度一样的最长字符串)
  3. 仅用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:11:36