2013-02-27 109 views
1

我想獲取一個包含x/y座標和方向信息(跨越或向下)的數據數組,並將鏈接共享單元格與增加的數字。這是一個縱橫字謎。原來這裏是數組:php標記網格交叉點x/y座標

Array 
(
[0] => Array 
    (
     [id] => 1 
     [puzzle_id] => 1 
     [word] => hello 
     [hint] => 
     [direction] => across 
     [grid_x] => 3 
     [grid_y] => 1 
    ) 

[1] => Array 
    (
     [id] => 2 
     [puzzle_id] => 1 
     [word] => loot 
     [hint] => 
     [direction] => down 
     [grid_x] => 5 
     [grid_y] => 1 
    ) 

[2] => Array 
    (
     [id] => 3 
     [puzzle_id] => 1 
     [word] => hellotest 
     [hint] => 
     [direction] => down 
     [grid_x] => 3 
     [grid_y] => 1 
    ) 

[3] => Array 
    (
     [id] => 4 
     [puzzle_id] => 1 
     [word] => looking 
     [hint] => 
     [direction] => across 
     [grid_x] => 3 
     [grid_y] => 3 
    ) 

我想1添加一個新的關鍵,所謂「民」每個條目,將在1開始,增量,但棘手的問題是我需要的對面,向下共享相同的數字,如果他們共享一個起始單元格(共享grid_x和grid_y)。這是我現在的代碼,但它不會產生我正在尋找的正確數字。

$puzzle_data2 = $puzzle_data; 


$across_counter = 1; 
foreach($puzzle_data as $rkey=>$row) 
{ 
    if($row['direction'] == 'across') 
    { 
     $puzzle_data[$rkey]['num'] = $across_counter++; 

     foreach($puzzle_data2 as $rkey2=>$row2) 
     { 
      if($row['direction'] == 'down') 
      { 
       if($row['grid_x'] == $row2['grid_x'] && $row['grid_y'] == $row2['grid_y']) 
       { 
        $puzzle_data[$rkey2]['num'] = $across_counter; 
        break; 
       } 
      } 
     } 
    } 
} 
foreach($puzzle_data as $rkey=>$row) 
{ 
    if(!isset($row['num'])) 
    { 
     $puzzle_data[$rkey]['num'] = $across_counter++; 
    } 
} 

我最終得到這樣的結果:

Array 
(
[0] => Array 
    (
     [id] => 1 
     [puzzle_id] => 1 
     [word] => hello 
     [hint] => 
     [direction] => across 
     [grid_x] => 3 
     [grid_y] => 1 
     [num] => 1 
    ) 

[1] => Array 
    (
     [id] => 2 
     [puzzle_id] => 1 
     [word] => loot 
     [hint] => 
     [direction] => down 
     [grid_x] => 5 
     [grid_y] => 1 
     [num] => 3 
    ) 

[2] => Array 
    (
     [id] => 3 
     [puzzle_id] => 1 
     [word] => hellotest 
     [hint] => 
     [direction] => down 
     [grid_x] => 3 
     [grid_y] => 1 
     [num] => 4 
    ) 

[3] => Array 
    (
     [id] => 4 
     [puzzle_id] => 1 
     [word] => looking 
     [hint] => 
     [direction] => across 
     [grid_x] => 3 
     [grid_y] => 3 
     [num] => 2 
    ) 

) 

我找的ID 1和3都爲 「1」。如果你想到一個縱橫字謎,其中一個橫向和縱向共享相同的起始單元格,並在橫向和縱向鍵中標記相同的數字,這就是我試圖用我的數據集來完成的任務。

謝謝你的時間。

enter image description here

+0

您的數據排序第一,使用行#和col#,那麼你的腳本將工作 – Waygood 2013-02-27 10:10:55

回答

0

你應該讓左上方條目是第一,要跨線,向下移動到下一行之前的數據先解決。 IE瀏覽器的方式。

我們可以採用grid_x和grid_y並計算哪個是第一個。

然後我們可以使用這些來排序數據。

function cmp($a, $b) 
{ 
    $a_index=($a['grid_y']*100)+$a['grid_x']; 
    $b_index=($b['grid_y']*100)+$b['grid_x']; 
    if ($a_index == $b_index) 
    { 
     return 0; 
    } 
    return ($a_index < $b_index) ? -1 : 1; 
} 
usort($puzzle_data, "cmp"); 

我用100這裏讓事情變得更容易,但你應該使用網格的寬度更準確。

X1,Y1會給101
X3,Y1會給103
X1,Y3會給301個
Y3,Y3會給303

這樣的順序將是101,103,301,303

然後使用grid_x和grid_y將數字應用於數據以測試是否已完成。

$number=1; 
$grid_numbers=array(); 
foreach($puzzle_data as $rkey=>$row) 
{ 
    if(isset($grid_numbers[$row['grid_x']][$row['grid_y']])) 
    { 
     $puzzle_data[$rkey]['num'] = $grid_numbers[$row['grid_x']][$row['grid_y']]; 
    } 
    else 
    { 
     $grid_numbers[$row['grid_x']][$row['grid_y']]=$number; 
     $puzzle_data[$rkey]['num']=$number; 
     $number++; 
    } 
} 

這應該是一切

+0

謝謝! ---- – Danny 2013-02-27 17:06:04