У меня есть массив с кратными цветовыми кодами 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
, а в чем может быть функция?
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;
}
Это отсортирует ваш массив и расставит все цвета по наибольшему количеству из трех цветов, затем сначала красные, затем зеленые, а затем синие. Я думаю, что это то, что вы хотели.
Проблема здесь в том, что если все числа одинаковы, они будут выброшены в массив других цветов. Вы никогда не говорили, что вы хотели, чтобы произошло в этом случае.
Используйте 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);
Это пример кода из того, что я понимаю из вашего вопроса
Обратите внимание, что это был просто пример, вы можете попробовать другой подход для более оптимизированного кода
$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);