【问题标题】:PHP - Sort arrays of rgb color codes by dominancePHP - 按优势对 rgb 颜色代码数组进行排序
【发布时间】:2015-12-29 14:22:10
【问题描述】:

我有一个包含多个 rgb 颜色代码的数组:

Array (
[0] => Array
    (
        [0] => 255
        [1] => 0
        [2] => 0
    )
[1] => Array
    (
        [0] => 125
        [1] => 20
        [2] => 255
    )
[2] => Array
    (
        [0] => 100
        [1] => 255
        [2] => 0
    )

[0] 是红色 [1] 是绿色 [2] 是蓝色 我之前用array_multisort($r,SORT_DESC,$g,SORT_DESC,$b,SORT_DESC,$array_rgb_colors); 对这个数组进行了排序 我想按颜色优势对这个数组进行排序:首先是红色,然后是绿色,然后是蓝色。在我的示例中,我将拥有:

Array (
[0] => Array
    (
        [0] => 255
        [1] => 0
        [2] => 0
    )
[2] => Array
    (
        [0] => 100 
        [1] => 255 
        [2] => 0
    )

[1] => Array
    (
        [0] => 125
        [1] => 20
        [2] => 255
    )

我想我需要usort,但功能是什么?

【问题讨论】:

  • 您是否尝试过任何回调,或者您要求从头开始?
  • 当您说主导时,您的意思是颜色需要为 255?如果它是一个更大的数组,它们如何排序?您能否更具体地说明您的排序模式。你的意思是取三个中最大的一个作为主色?
  • 为什么要把rgb(100,255,0)放在rgb(125,20,255)前面?

标签: php arrays sorting colors


【解决方案1】:
public function main() {    
    $colors = [
        0 => [
            0 => 255,
            1 => 0,
            2 => 0
        ],
        1 => [
            0 => 125,
            1 => 20,
            2 => 255
        ],
        2 => [
            0 => 100,
            1 => 255,
            2 => 0
        ]
    ];

    $sortedColors = $this->sortByColor($colors);

    print_r($sortedColors);
}

public function sortByColor($colors) {
    $reds = [];
    $greens = [];
    $blues = [];
    $otherColors = [];
    $sortedArray = [];
    foreach($colors as $color) {
        if($color[0] > $color[1] && $color[0] > $color[2]) {
            $reds[] = $color;
        }
        elseif($color[1] > $color[0] && $color[1] > $color[2]) {
            $greens[] = $color;
        }
        elseif($color[2] > $color[0] && $color[2] > $color[1]) {
            $blues[] = $color;
        }
        else {
            $otherColors[] =$color;
        }
    }
    $sortedArray = array_merge($sortedArray, $reds);
    $sortedArray = array_merge($sortedArray, $greens);
    $sortedArray = array_merge($sortedArray, $blues);
    $sortedArray = array_merge($sortedArray, $otherColors);

    return $sortedArray;
}

这将对您的数组进行排序,并根据三种颜色中最大的数量放置所有颜色,然后首先是红色,然后是绿色,然后是蓝色。我想这就是你想要的。

这里的问题是,如果所有数字都相同,它们将被扔到 othercolors 数组中。在那种情况下,你从来没有说过你想要发生的事情。

【讨论】:

  • 没问题 这样做很有趣
【解决方案2】:

使用 uasort 并逐步比较.. 尝试关注 -

function my_sort($a,$b)
{
if($a==$b) return 0; 
if ($a[0]==$b[0])
    {
        if($a[1]==$b[1])
           {
              return ($a[2]<$b[2])?-1:1; //return comparing blue
           }
           return ($a[1]<$b[1])?-1:1;  //return comparing green
    }
return ($a[0]<$b[0])?-1:1; //return comparing red
}
uasort($arr,"my_sort"); // call your array here
print_r($arr);

【讨论】:

    【解决方案3】:

    这是我从您的问题中了解到的示例代码
    请注意,这只是一个示例,您可以尝试另一种方法以获得更优化的代码

    $array =  array(
      array('0' => '255','1' => '0','2' => '0'),
      array('0' => '125','1' => '20','2' => '255'),
      array('0' => '100','1' => '255','2' => '0'),
      array('0' => '125','1' => '20','2' => '255'),
      );
    
    $colorArray = array('r'=>array('0' => '255','1' => '0','2' => '0'),
      'g'=>array('0' => '100','1' => '255','2' => '0'),
      'b'=>array('0' => '125','1' => '20','2' => '255'),
      );
    
    $finalColor = array();
    foreach ($array as $key => $value) {
      if($value == $colorArray['r']){
        $finalColor[$key] = $value;
      }
    }
    
    foreach ($array as $key => $value) {
      if($value == $colorArray['g']){
        $finalColor[$key] = $value;
      }
    }
    foreach ($array as $key => $value) {
      if($value == $colorArray['b']){
        $finalColor[$key] = $value;
      }
    }
    
    
    echo '<pre>';print_r($finalColor);
    

    【讨论】:

    • 这只有在数组只有这些值时才有效。如果它们的数组有其他值,您的代码将无法正常工作。
    • 已经说过,正如我从问题中理解的那样......还有什么数组被发布
    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 2016-11-06
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多