Laravel/PHP多维数组8方向字符串搜索方案问询
8方向多维数组单词搜索实现(PHP/Laravel)
嘿,这个需求确实挺实用的,但遗憾的是PHP或Laravel并没有原生函数直接处理这种带多方向的多维数组单词搜索。不过咱完全可以写一个比嵌套IF优雅得多的实现,核心思路是用「方向坐标数组」来替代一堆条件判断,代码可读性和扩展性都会好很多。
核心思路
把8个搜索方向转化为坐标增量的数组,比如:
- 从左到右:
[0, 1](行不变,列+1) - 从右到左:
[0, -1](行不变,列-1) - 从上到下:
[1, 0](行+1,列不变) - 从下到上:
[-1, 0](行-1,列不变) - 右下对角线:
[1, 1](行+1,列+1) - 左下对角线:
[1, -1](行+1,列-1) - 右上对角线:
[-1, 1](行-1,列+1) - 左上对角线:
[-1, -1](行-1,列-1)
然后遍历数组的每个单元格作为起点,对每个方向检查:从起点出发,沿着该方向走「单词长度-1」步,所有位置的字符是否和单词对应位置匹配。如果匹配,就计数+1。
PHP 实现代码
function searchWordInMultiArray(array $grid, string $word): int { $count = 0; $wordLength = strlen($word); // 边界情况处理:空单词或空数组直接返回0 if ($wordLength === 0 || empty($grid)) { return $count; } $rows = count($grid); $cols = count($grid[0]); // 定义8个搜索方向的坐标增量 $directions = [ [0, 1], [0, -1], // 左右 [1, 0], [-1, 0], // 上下 [1, 1], [1, -1], // 右下、左下 [-1, 1], [-1, -1] // 右上、左上 ]; // 遍历每个单元格作为起点 for ($i = 0; $i < $rows; $i++) { for ($j = 0; $j < $cols; $j++) { // 如果起点字符不匹配单词首字符,直接跳过 if ($grid[$i][$j] !== $word[0]) { continue; } // 遍历每个方向检查 foreach ($directions as [$dx, $dy]) { $currentRow = $i; $currentCol = $j; $matchCount = 1; // 检查剩余的字符 for ($k = 1; $k < $wordLength; $k++) { $currentRow += $dx; $currentCol += $dy; // 超出数组边界,或者字符不匹配,终止当前方向的检查 if ($currentRow < 0 || $currentRow >= $rows || $currentCol < 0 || $currentCol >= $cols || $grid[$currentRow][$currentCol] !== $word[$k]) { break; } $matchCount++; } // 如果所有字符都匹配,计数+1 if ($matchCount === $wordLength) { $count++; } } } } return $count; }
Laravel 适配方案
Laravel里可以把这个逻辑封装成自定义Collection方法,用起来更符合框架风格:
- 在
app/Providers/AppServiceProvider.php的boot方法里扩展Collection:
use Illuminate\Support\Collection; Collection::macro('searchWord', function (string $word) { $grid = $this->toArray(); return searchWordInMultiArray($grid, $word); });
- 使用的时候就可以这样:
$grid = collect([ ['O', 'N', 'E'], ['T', 'W', 'O'], ['T', 'H', 'R'] ]); $occurrences = $grid->searchWord('ONE'); // 返回1
代码优势
- 完全摆脱嵌套IF的臃肿结构,逻辑清晰
- 方向数组可灵活扩展(比如要加斜向的其他方向,直接在
$directions里加就行) - 处理了边界情况,避免数组越界错误
- 可复用性强,不管是3x3、1x10还是其他尺寸的规则数组都能适配
内容的提问来源于stack exchange,提问作者alan
相关产品推荐
相关产品推荐

