【问题标题】:Sorting images array into gallery columns将图像数组排序到图库列中
【发布时间】:2013-01-02 09:17:28
【问题描述】:

这个问题有点像我之前的一个问题here

但是,我想用最基本的术语来说明这一点,希望有人能够帮助我找到解决方案。

考虑这个多维数组:

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

我正在努力编写一个算法来实现上述目标。任何人都可以在不使用大量嵌套循环等的情况下找到实现这一目标的好方法吗?

【问题讨论】:

  • 嗨,Ben,您有需要的特定宽度吗?另外,图像的高度范围是多少? :) 世界末日快乐!
  • @JoshBrody 图像的宽度始终相同,列的高度尽可能高。这取决于数组中的图像数量,页面将无限滚动。有关更多详细信息,请参阅我的其他问题stackoverflow.com/questions/13840168/…

标签: php image gallery sinemacula


【解决方案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']);
}

由于您是按照从大到小的顺序插入图像,因此您可以在插入完成后随机播放图像。这样它就不会在顶部有所有的大图像,而在底部有小图像。

【讨论】:

  • 非常感谢,反正我是要实现shuffle功能的,问题是,我希望它们总是以相同的顺序显示。有没有办法打乱订单,但要确保它总是一样的。我意识到这句话自相矛盾,但你应该明白我的意思:-)。 显而易见的方法是仅按“创建日期”之类的内容进行排序,但这意味着从文件中检索创建日期,这在处理大量图像时可能会很昂贵...
  • 是的,使用srand()。只需将种子值设为常数,并假设您拥有相同的图像,它们将始终以相同的顺序随机播放。
猜你喜欢
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2015-05-03
  • 2021-07-06
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多