PHP - 按优势排序rgb颜色代码数组

时间:2015-10-01 13:40:31

标签: php arrays sorting colors

我有一个带有多个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,但可能是什么功能?

3 个答案:

答案 0 :(得分: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数组。在这种情况下,你从未说过你想要发生什么。

答案 1 :(得分:0)

使用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);

答案 2 :(得分:0)

这是我从您的问题中理解的示例代码
请注意,这只是一个示例,您可以尝试使用其他方法来获得更优化的代码

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