将图像数组排序到库列中


Sorting images array into gallery columns

这个问题有点延续了我之前的一个问题。

然而,我想用最基本的术语来说明这一点,希望有人能帮助我找到解决这个问题的方法。

考虑这个多维数组:

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

注意,数组已经按照高度降序排序了!

这些图像需要被推入三列,同时试图保持列的高度尽可能均匀。所以结果数组(上面的例子)看起来像这样:

$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
            ),
        )
    )
);

我正在努力写一个算法来实现上述目标。有没有人能找到一种不用使用很多嵌套循环的好方法?

这可能是你正在寻找的:

$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']);
}

由于您是按照从大到小的顺序插入图像的,因此您可以在插入完成后对图像进行洗牌。这样就不会有所有的大图片在顶部,而小的在底部。