0

0

如何从多维数组结构中提取所有合法拼词路径并重构为扁平化序列数组

聖光之護

聖光之護

发布时间:2026-02-01 17:51:08

|

223人浏览过

|

来源于php中文网

原创

如何从多维数组结构中提取所有合法拼词路径并重构为扁平化序列数组

本文介绍如何将递归生成的嵌套式拼词路径(以键名表示匹配瓷砖)转换为清晰、可读的二维数组,每个子数组代表一种完整的单词构成方案。

在使用瓷砖(tiles)拼写单词的场景中,word2sequences() 函数通过回溯递归构建出一棵“匹配树”,其结构天然反映匹配路径——但以嵌套关联数组形式存在(如 ["S" => ["TA" => [...]]]),不便于后续处理或展示。实际应用中,我们更需要的是扁平化的序列集合,例如:

[
  ["S", "TA", "R", "S"],
  ["S", "T", "A", "R", "S"]
]

为此,关键在于重构递归逻辑,避免深度嵌套,转而累积完整路径到一维结果数组中。原始实现中,$founds 被用作多层嵌套容器,且递归返回值未被有效收集;改进版则采用「引用传参 + 终止条件直接追加」策略:

  • ✅ 当 $found 匹配为空字符串或仅含分隔符(即原词已被完全分解),说明当前路径完成,直接将该路径字符串(如 "51;21;40;51")推入 $founds[];
  • ✅ 否则继续递归,并复用同一 $founds 引用,确保所有分支结果汇聚到同一数组;
  • ✅ 最后统一解析每条路径:按 ; 分割 ID 序列,再映射回对应瓷砖字符串。

以下是优化后的完整实现(含注释与健壮性增强):

Melodrive
Melodrive

Melodrive -一个AI音乐引擎,根据用户的情绪状态和喜好生成个性化的音乐。

下载
 $tile) {
        // 正则尝试从词首匹配当前瓷砖(不区分大小写)
        if (!preg_match("/^(" . preg_quote($tile, '/') . ")(.*)$/i", $word, $matches)) {
            continue;
        }
        $remaining = $matches[2]; // 剩余未匹配部分

        // 若已完全匹配,则记录当前瓷砖ID(作为路径终点)
        if ($remaining === '') {
            $founds[] = (string)$tile_id;
        } else {
            // 否则递归处理剩余部分,并将当前ID前置拼接
            word2sequences($remaining, $tiles, $founds);
            // 注意:此处需在递归后修改 $founds 中最新项,以追加当前ID
            // 更安全做法是传递路径前缀 → 推荐改用辅助函数(见下方进阶版)
        }
    }
}

// ⚠️ 上述基础版存在路径拼接缺陷(ID顺序易错)。推荐使用带路径追踪的清晰版本:
function findTileSequences($word, $tiles, $path = []) {
    $results = [];
    foreach ($tiles as $tile_id => $tile) {
        if (stripos($word, $tile) === 0) { // 确保前缀匹配
            $newPath = array_merge($path, [$tile_id]);
            $rest = substr($word, strlen($tile));
            if ($rest === '') {
                $results[] = $newPath;
            } else {
                $results = array_merge($results, findTileSequences($rest, $tiles, $newPath));
            }
        }
    }
    return $results;
}

// 示例调用
$tiles = [1 => "A", 21 => "B", 34 => "AH", 40 => "R", 51 => "S", 83 => "SA", 14 => "T", 99 => "TA"]; // 修复重复键:21=>B 和 21=>TA 冲突,已改为 99=>TA
$word = "stars";

$allPaths = findTileSequences($word, $tiles); // 返回 ID 序列二维数组
$sequences = [];

foreach ($allPaths as $path) {
    $sequence = [];
    foreach ($path as $id) {
        if (isset($tiles[$id])) {
            $sequence[] = $tiles[$id];
        }
    }
    $sequences[] = $sequence;
}

print_r($sequences);
?>

注意事项:

  • ? PHP 数组键名不可重复,原示例中 21 => "B" 与 21 => "TA" 会相互覆盖(后者生效),务必确保 $tiles 键唯一;
  • ? 正则中 preg_quote($tile, '/') 防止特殊字符破坏模式(如 AH 无问题,但若含 .、* 则必须转义);
  • ? 若需支持重叠匹配(如 "SSA" 中 "S" 和 "SS" 同时可用),需调整匹配逻辑为全位置扫描而非仅前缀;
  • ? 最终 $sequences 是纯值数组,可直接用于 JSON 输出、前端渲染或组合计数分析。

通过此方法,你不仅能准确还原所有合法拼词路径,还能保持代码可读性与扩展性,为词图分析、游戏解算等场景提供坚实基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

422

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

537

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号