1

この質問は、私の以前の質問hereから引き継がれているようなものです。

ただし、誰かがこれに対する解決策を見つけるのを手伝ってくれることを願って、これを最も基本的な用語で説明したいと思います.

次の多次元配列について考えてみましょう。

$images = array(
    0 = array(
        'height' => 100
    ),
    1 = array(
        'height' => 90
    ),
    2 = array(
        'height' => 60
    ),
    3 = array(
        'height' => 30
    )
);

配列はすでに高さの降順でソートされていることに注意してください。

これらの画像は、列の高さをできるだけ均一に保ちながら、3 つの列にプッシュする必要があります。したがって、(上記の例の) 結果の配列は次のようになります。

$gallery_columns = array(
    1 => array(
        'height' => 100
        'images' => array(
            0 = array(
                'height' => 100
            ),
        )
    ),
    2 => array(
        'height' => 90
        'images' => array(
            0 = array(
                'height' => 90
            ),
        )
    ),
    3 => array(
        'height' => 90
        'images' => array(
            0 = array(
                'height' => 60
            ),
            1 = array(
                'height' => 30
            ),
        )
    )
);

上記を達成するためのアルゴリズムを書くのに苦労しています。多くのネストされたループなどを使用せずにこれを達成する良い方法を誰かが見ることができますか?

4

1 に答える 1

1

これはあなたが探しているものかもしれません:

$images = array(
    0 => array(
        'height' => 100
    ),
    1 => array(
        'height' => 90
    ),
    2 => array(
        'height' => 60
    ),
    3 => array(
        'height' => 30
    )
);

$gallery_columns = array(
    1 => array(
        'height' => 0,
        'images' => array()
    ),
    2 => array(
        'height' => 0,
        'images' => array()
    ),
    3 => array(
        'height' => 0,
        'images' => array()
    )
);



foreach ($images as $img)
{
    // start with first column as the shortest
    $shortest_colm = &$gallery_columns[1];

    // loop over all the columns, updating the shortest column if shorter
    for ($i = 2; $i <= 3; $i++)
    {
        if ($gallery_columns[$i]['height'] < $shortest_colm['height'])
        {
            $shortest_colm = &$gallery_columns[$i];
        }
    }

    // push the image into the shortest column
    $shortest_colm['height'] += $img['height'];
    $shortest_colm['images'][] = $img;
}

print_r($gallery_columns);

出力:

Array
(
    [1] => Array
        (
            [height] => 100
            [images] => Array
                (
                    [0] => Array
                        (
                            [height] => 100
                        )

                )

        )

    [2] => Array
        (
            [height] => 90
            [images] => Array
                (
                    [0] => Array
                        (
                            [height] => 90
                        )

                )

        )

    [3] => Array
        (
            [height] => 90
            [images] => Array
                (
                    [0] => Array
                        (
                            [height] => 60
                        )

                    [1] => Array
                        (
                            [height] => 30
                        )

                )

        )

)

ボーナス:

foreach($gallery_columns as &$column)
{
    shuffle($column['images']);
}

大きいものから小さいものへと順番に画像を挿入しているので、挿入が完了したら画像をシャッフルできます。そうすれば、すべての大きな画像が上部にあり、小さな画像が下部にあるわけではありません。

于 2013-01-02T09:41:46.387 に答える