2013-02-27 2 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 새로운 일에 시작됩니다 "NUM"라고 각 항목에 키와 증분을 추가 할 수는 있지만, 까다로운 부분은 I가 건너와이 필요하다 (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++; 
    } 
} 

나는이 결과를 그만 둘 : 나는 둘 수 "1"로 ID 1과 3을 찾고

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 
    ) 

) 

. 십자형 퍼즐에 대해 생각해 보면 십자형 퍼즐을 생각할 때 가로 건너 뛰기에서 동일한 번호의 동일한 시작 셀을 공유하는 것은 내 데이터 세트로 수행하려고하는 것입니다.

감사합니다. 왼쪽 상단에있는 항목이 다음 행으로 아래로 이동하기 전에 라인을 가로 질러가는 첫되도록

enter image description here

+0

종류의 데이터 첫번째 모든 행 번호와 안부 #을 사용해야

$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++; } } 

, 다음 스크립트가 작동 – Waygood

답변

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는 Y3 줄수, Y3 301
Y3을주는 것 (103)
X1을 줄 것이다 303

그래서 순서 101, 103, 301, 303 것

그런 다음 grid_x 및 grid_y를 사용하여 데이터에 숫자를 적용하여 이미 수행했는지 테스트합니다.

+0

당신을 감사합니다! ---- – Danny