【问题标题】:Array of all RGB permutations in PHPPHP中所有RGB排列的数组
【发布时间】:2014-01-21 20:59:40
【问题描述】:

我正在尝试创建一个由 RGB 值组成的所有可能颜色的数组。 r=0 b=0 g=0 到 r=255 b=255 g=255 之间的每个排列。我的函数的想法是,当它被调用时,您提供一个限制数字,以便该函数返回一个 RGB 值数组,直到这个数字,以阻止它返回所有 1600 万。我下面的代码返回 767 个排列 (256 * 3) 我如何让它返回完整的 1600 万,直到我提供的限制数量?

function colourArray($number) {

    $r = 0;

    $g = 0;

    $b = 0;

    $i = 0;

    while ($i <= $number) {

        $colours[] = array($r,$g,$b);

        $r++;

        $i++;

    }

    $i = 0;

    while ($i <= $number) {

        $colours[] = array($r,$g,$b);

        $g++;

        $i++;

    }

    $i = 0;

    while ($i <= $number) {

        $colours[] = array($r,$g,$b);

        $b++;

        $i++;

    }


    return $colours;

}

【问题讨论】:

  • 看起来你需要嵌套你的while循环。但是拥有 1600 万个数组可能会导致过载、超时或其他问题
  • 这只是一个练习吗?因为我确信有比计算这个更好的方法来解决您的问题。
  • 是的,这只是一个有趣的练习。
  • 拿一张纸,假装你是php解释器。现在运行您的代码。这样一来,您就会发现为什么您在如此微不足道的任务中失败了。
  • 为什么还要循环检查值,当转换为 int 并检查值高于或低于某个阈值时,效率会更高。简而言之,您不需要循环每个可能的值来确定一个值是否在给定的有效范围内。

标签: php arrays permutation rgb


【解决方案1】:

嵌套循环是诀窍。试试下面的例子。我已经用 PHP range 函数用 foreach-loops 替换了你的 while-loops,并将它们嵌套(即 loop-inside-a-loop)彼此内部:

function colourArray($number) {
        $colours = array();
        foreach(range(0,$number) as $r) {
            foreach(range(0,$number) as $g) {
                foreach(range(0,$number) as $b) {
                    $colours[] = array($r,$g,$b);
                }
            }
        }
        return $colours;
}

参考文献

http://php.net/range

http://php.net/manual/en/control-structures.foreach.php

【讨论】:

  • 这里为什么更喜欢foreachrange() 而不是for
  • 是的,我也想知道这个。当它是对象数组或数组数组时,我更喜欢 foreach。每当我遍历本质上是一组数字的内容时,我总是使用 for()。
  • 在我看来,它也可能是一个 for 循环。在这个例子中,Foreach 更短。 Foreach 创建 range(0,$number) 本身的副本。虽然我应该只声明一次 range(),但事后看来。
  • 他是一个伪装的pythonist :)
【解决方案2】:

我几乎同意 DickW,但我偏爱用于数字范围的 for() 循环。

<?php

function color_array($range)
{
    $result = array();

    for ($r = 0; $r <= $range; $r++) {
        for ($g = 0; $g <= $range; $g++) {
            for ($b = 0; $b <= $range; $b++) {
                $result[] = array($r, $g, $b);
            }
        }
    }

    return $result;
}

print_r(color_array(5));

【讨论】:

  • 这也很好,确实。如果你问我,这与个人喜好有关。
猜你喜欢
  • 2018-07-19
  • 2012-04-30
  • 2010-09-23
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多