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

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方法,用起来更符合框架风格:

  1. 在app/Providers/AppServiceProvider.php的boot方法里扩展Collection:
use Illuminate\Support\Collection;

Collection::macro('searchWord', function (string $word) {
    $grid = $this->toArray();
    return searchWordInMultiArray($grid, $word);
});
  1. 使用的时候就可以这样:
$grid = collect([
    ['O', 'N', 'E'],
    ['T', 'W', 'O'],
    ['T', 'H', 'R']
]);
$occurrences = $grid->searchWord('ONE'); // 返回1

代码优势

  • 完全摆脱嵌套IF的臃肿结构,逻辑清晰
  • 方向数组可灵活扩展(比如要加斜向的其他方向,直接在$directions里加就行)
  • 处理了边界情况,避免数组越界错误
  • 可复用性强,不管是3x3、1x10还是其他尺寸的规则数组都能适配

内容的提问来源于stack exchange,提问作者alan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:05:50