在使用PHP处理单词组合、词库层级关联等场景时,我们常常需要递归构建单词的多维数组路径,同时提取所有符合规则的拼接序列。下面先介绍整体的实现思路,再给出完整的代码实现。

核心实现思路
要实现递归构建多维数组路径并提取有效拼接序列,我们可以拆分为两个核心步骤:一是通过递归遍历单词列表,按照层级关系构建多维数组路径;二是在递归过程中校验当前路径是否符合有效序列的规则,将符合要求的序列收集起来。下面我们逐步拆解实现逻辑。
多维数组路径的递归构建
假设我们有一个单词列表,每个单词可以作为下一层级的父节点,我们需要按照层级关系把单词组织成多维数组。递归的核心逻辑是:当前层级的每个单词作为键,下一层级符合条件的单词作为子数组,直到没有更多可关联的单词为止。
有效拼接序列的提取规则
有效拼接序列通常指路径中连续拼接的单词符合预设的规则,比如长度不超过指定值、不包含特定字符等。我们在递归遍历路径的过程中,实时拼接当前路径的所有单词,校验是否符合规则,符合则加入结果集。
完整代码示例
以下是一个完整的PHP实现示例,包含递归构建路径和提取有效序列的逻辑:
<?php
/**
* 递归构建单词多维数组路径并提取有效拼接序列
* @param array $wordList 原始单词列表
* @param int $maxDepth 最大递归深度,避免无限递归
* @param string $parentWord 父级单词,初始为空
* @param array $currentPath 当前递归路径
* @param array $result 收集的有效序列结果
* @return array 构建完成的多维数组路径
*/
function buildWordPathAndExtractSeq($wordList, $maxDepth = 3, $parentWord = '', $currentPath = [], &$result = []) {
$pathTree = [];
// 遍历当前层级的单词
foreach ($wordList as $word) {
// 如果设置了父级单词,校验当前单词是否可关联(这里示例为单词首字母和父级单词尾字母相同)
if (!empty($parentWord) && strtolower($word[0]) != strtolower($parentWord[strlen($parentWord)-1])) {
continue;
}
// 当前路径加入当前单词
$newPath = array_merge($currentPath, [$word]);
// 拼接当前路径的所有单词作为序列
$seq = implode('_', $newPath);
// 校验序列是否有效:长度不超过20,且不包含数字
if (strlen($seq) <= 20 && !preg_match('/d/', $seq)) {
$result[] = $seq;
}
// 如果未达到最大深度,递归构建下一层路径
if (count($newPath) < $maxDepth) {
$childTree = buildWordPathAndExtractSeq($wordList, $maxDepth, $word, $newPath, $result);
$pathTree[$word] = $childTree;
} else {
$pathTree[$word] = [];
}
}
return $pathTree;
}
// 测试数据
$wordList = ['apple', 'elephant', 'tiger', 'rabbit', 'tea', 'air'];
$validSequences = [];
// 调用函数,最大深度设为3
$pathTree = buildWordPathAndExtractSeq($wordList, 3, '', [], $validSequences);
// 输出多维数组路径
echo "构建的多维数组路径:n";
print_r($pathTree);
// 输出所有有效拼接序列
echo "n所有有效拼接序列:n";
print_r($validSequences);
?>
代码逻辑说明
上述代码中,buildWordPathAndExtractSeq函数是核心递归函数:
- 首先遍历传入的单词列表,根据父级单词校验当前单词是否可加入路径,示例中是校验当前单词首字母和父级单词尾字母是否相同,可根据实际需求修改校验规则。
- 将当前单词加入路径后,拼接所有路径单词生成序列,校验序列是否符合有效规则,符合则存入结果数组。
- 如果当前路径深度未达到最大深度,递归调用函数构建下一层路径,否则将当前单词作为路径的叶子节点。
测试数据中,单词列表包含6个常见单词,最大递归深度设为3,最终会输出完整的多维数组路径和所有符合规则的有效拼接序列。
总结
通过递归的方式,我们可以高效地构建单词的多维数组路径,同时在递归过程中同步提取有效拼接序列,避免二次遍历路径。实际使用中可以根据业务需求调整单词关联规则、有效序列校验逻辑和最大递归深度,适配不同的场景需求。如果单词列表较大,还可以加入缓存机制,避免重复计算提升性能。