Сортировать массивы цветовых кодов RGB по доминированию

У меня есть массив с кратными цветовыми кодами 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, а в чем может быть функция?

2

Решение

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;
}

Это отсортирует ваш массив и расставит все цвета по наибольшему количеству из трех цветов, затем сначала красные, затем зеленые, а затем синие. Я думаю, что это то, что вы хотели.

Проблема здесь в том, что если все числа одинаковы, они будут выброшены в массив других цветов. Вы никогда не говорили, что вы хотели, чтобы произошло в этом случае.

1

Другие решения

Используйте 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);
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);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector