1

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 ずつ増加する「num」という各エントリに新しいキーを追加したいのですが、トリッキーな部分は、開始セルを共有している場合 (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」になるように探しています。下向きと横向きが同じ開始セルを共有し、横向きキーと下向きキーで同じ数字がラベル付けされているクロスワード パズルについて考える場合、それが私のデータ セットで達成しようとしていることです。

御時間ありがとうございます。

ここに画像の説明を入力

4

1 に答える 1

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

それがすべてでなければなりません

于 2013-02-27T10:31:11.390 に答える