2013-06-10 47 views
6

Tôi đã một chuỗi mô tả một ma trận các yếu tố NxM như thế này:php dọc thường xuyên tìm kiếm biểu

§inputmap = " 
~~~~~~~~~~~~~~~~~~~~B~~~~~~~~~~~~~~~~~~~ 
~~~~~~~~~~~~~BBB........BBB~~~~~~~~~~~~~ 
~~~~~~~~~~BB...............FBB~~~~~~~~~~ 
~~~~~~~~BB....................BB~~~~~~~~ 
~~~~~~BB.....F..................BB~~~~~~ 
~~~~~BB.....................F.....B~~~~~ 
~~~~B..............................B~~~~ 
~~~B........F.......................B~~~ 
~~BB.........F......................BB~~ 
~~B................F.................BB~ 
~BF....F....F........................FB~ 
~B.....................................B 
B.....................................FB 
B........F......F......................B 
B...........................F..........B 
B......................................B 
B......................................B 
B.......F.......................F......B 
B......FFF.............................B 
B.......F.............................FB 
~B..................F.................FB 
~BF...........................F.......B~ 
~~B...F...........F..........FFFFF.F.BB~ 
~~BB..................F..F....F.....BB~~ 
~~~B.......................FF.FF....B~~~ 
~~~~B..............................B~~~~ 
~~~~~BB...........................B~~~~~ 
~~~~~~BB........................BB~~~~~~ 
~~~~~~~~BB..........F..........B~~~~~~~~ 
~~~~~~~~~~BB................BB~~~~~~~~~~ 
~~~~~~~~~~~~~BBB.......F.BBB~~~~~~~~~~~~ 
~~~~~~~~~~~~~~~~~BBBBBB~~~~~~~~~~~~~~~~~ 
"; 
$inputmap = trim($inputmap); 

tôi cần phải xây dựng một biểu thức chính quy (hay cái gì khác) để tìm kiếm trên chuỗi:

$search = " 
*F* 
FFF 
*F* 
"; 
$search = trim($search); 

trên toàn bộ lưới. Mặt khác, tôi cần phải tìm một mô hình của 5 chữ cái riêng biệt "F" (3 theo chiều dọc và 3 chiều) lấy lại các hàng/cột vị trí của (các) mẫu được tìm thấy trên bản đồ.

Xem xét ma trận đầu vào có thể khác (5x5 hoặc 10x10 hoặc 20x25 hoặc ...), có cách nào giải quyết vấn đề của tôi với php và cụm từ thông dụng không?

+2

Tôi không nghĩ rằng cụm từ thông dụng là công cụ thích hợp cho công việc này. Bạn nên chuyển đổi chuỗi thành mảng hai chiều và tìm kiếm thông qua mảng. Điều này có thể được thực hiện trong thời gian "tuyến tính" (thực tế, nếu đó là ma trận vuông có chiều dài cạnh n, có thể dễ dàng thực hiện trong (n)^2 thời gian) – FrankieTheKneeMan

+0

Vấn đề của bạn quá phức tạp để sử dụng cụm từ thông dụng. Viết một đoạn mã nhỏ để tìm dòng đầu tiên của tìm kiếm của bạn trong đầu vào và xác minh xem các dòng khác có khớp với dưới đây chỉ với các chỉ mục mảng – ffarquet

+1

Đầu tiên, bạn có thể chỉ cho chúng tôi những gì bạn đã thử; chúng tôi ở đây để giúp không làm mọi thứ cho bạn. Các giải pháp chung là cho mỗi bộ kiểm tra một phần phụ của lưới điện (0-2) và hàng (0-2) sau đó di chuyển trên một; và tiếp tục kiểm tra cho đến khi bạn nhấn vào cuối hàng. Sau đó di chuyển một cột xuống tại cols (0-2) và hàng (1-3) và tiếp tục đọc ở bên phải cho đến khi bạn đạt đến phía dưới bên phải của mảng của bạn. Bạn có thể giải quyết điều này thông qua việc lập chỉ mục mảng hoặc tạo một chuỗi lớn và phân tích cú pháp theo cách đó. –

Trả lời

3

Bạn có thể làm điều gì đó như thế này (không có biểu thức chính quy) :

$map = explode("\n", $inputmap); 

for ($vcount = 0; $vcount < sizeof($map); ++$vcount) { // Loop through the map vertically 
    for ($hcount = 0; $hcount < strlen($map[$vcount]); ++$hcount) { // Loop through each character of each line 
     if ($map[$vcount][$hcount] == "F") { 
      if ($map[$vcount + 1][$hcount - 1] == "F" && $map[$vcount + 1][$hcount] == "F" && 
       $map[$vcount + 1][$hcount + 1] == "F" && $map[$vcount + 2][$hcount] == "F") 
       echo "Pattern found, starting at : (v)$vcount x (h)$hcount"; 
     } 
    } 
} 

$> php test.php 
php test.php 
Pattern found, starting at : (v)18 x (h)8 
Pattern found, starting at : (v)22 x (h)30 
$> 

Nhưng tôi phải thừa nhận rằng có thể mất một thời gian cho các bản đồ cực lớn.

/! \ Thêm một số mã để xác minh rằng dòng $vcount + 1/2 thực sự tồn tại và char $hcount + 1 cũng vậy.

4

Bạn có thể sử dụng $length=strstr($inputmap,"\n") để tìm chiều rộng của mỗi dòng. Sau đó, bạn có thể xây dựng cụm từ thông dụng sẽ tìm thấy F, theo sau là ($length-2) các ký tự khác, tiếp theo là 3 F, tiếp theo là ($length-2) các ký tự khác, theo sau là F.

+0

Đây là một giải pháp thực sự dí dỏm. Nhưng tôi nghĩ rằng regex bạn đang tìm kiếm là (đối với ma trận NxM) '/ F. {N-1} FFF. {N-1} F/s' – FrankieTheKneeMan

+0

http://regexr.com?3565m – FrankieTheKneeMan

1

thử với mô hình này:

nếu cuối dòng là \n:

$pattern = '~F.{'. ($n-2) . '}FFF.{' . ($n-2) . 'F~s'; 

nếu cuối dòng được \r\n sau đó thay thế bằng $n-3

hoặc tốt hơn sử dụng quinxorin trick để biết độ dài dòng cho đến khi \n

1

@FrankieTheKneeMan & tất cả ... cách tiếp cận ban đầu của tôi là xây dựng biểu thức chính quy 'n' cho các ký tự 'n' của bản đồ lưới đầu vào. Một cái gì đó giống như ...

$search_001 = " 
.F...................................... 
FFF..................................... 
.F...................................... 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
"; 


$search_002 = " 
..F..................................... 
.FFF.................................... 
..F..................................... 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
"; 

(... omissis ...)

$search_100 = " 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
..........F............................. 
.........FFF............................ 
..........F............................. 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
"; 

(... omissis ...)

$search_999 = " 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
........................................ 
......................................F. 
.....................................FFF 
......................................F. 
"; 

ở đâu "" obvioulsy có nghĩa là bất kỳ nhân vật nào.

Đây có phải là một ý tưởng ngu ngốc không?!?

+2

có - ---------- – MarZab

+0

@MarZab ... Tôi đánh giá cao sự thẳng thắn của bạn! (và tôi không mỉa mai!) –

2

Bạn có thể sử dụng đoạn mã sau:

$lines = array_filter(preg_split("#\r\n?|\n#", $string)); // Creating array of lines 
$matrix = array_map('str_split', $lines); // Creating a matrix 

foreach($lines as $line_number => $line_content){ // Looping through the lines 
    $pos = strpos($line_content, 'FFF'); 
    if(!$pos === false){// If FFF found 
     while(true){ 
      if(isset($matrix[$line_number-1][$pos+1],$matrix[$line_number+1][$pos+1]) && $matrix[$line_number-1][$pos+1] == 'F' && $matrix[$line_number+1][$pos+1] == 'F'){ //Checking ... 
       echo 'Found at: X:'.$pos.' & Y:'.$line_number.'<br>'; // Ouput 
      } 
      $pos = strpos($line_content, 'FFF', $pos+1); // Search further 
      if(!is_int($pos)){ 
       break; 
      } 
     } 
    } 
} 

gì đang xảy ra?

  1. Chúng tôi tạo ra một loạt các dòng
  2. Chúng tôi tạo ra một ma trận
  3. Chúng tôi vòng qua dòng và tìm kiếm FFF này là để tăng hiệu suất. Vì vậy, thay vì lặp qua toàn bộ ma trận và tìm kiếm F, chúng tôi trực tiếp tìm kiếm FFF
  4. Kiểm tra nếu giá trị tồn tại trong ma trận (để ngăn chặn các lỗi chỉ số không xác định) và sau đó kiểm tra xem nó bằng F
  5. Output
  6. Tìm thêm trên cùng một dòng

Online demo

Lưu ý rằng tọa độ là trung tâm của +

+1

Ma trận có thể không giúp bạn. Bạn chỉ có thể sử dụng '$ lines',' stripos' và 'substr'. – FrankieTheKneeMan

+0

@FrankieTheKneeMan Đúng, nhưng nếu tôi thực hiện '$ lines [$ i] [$ y]' thì sẽ rất khó hiểu. – HamZa

+0

Điều gì sẽ '$ dòng [$ i] [$ y]' tương ứng với? bạn hầu như không cần nó chút nào. – FrankieTheKneeMan

Các vấn đề liên quan