Как добавить код цвета для значений массива - PullRequest
0 голосов
/ 10 июня 2019

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

$level2 = array(
array ("marketMakerId" =>'CSTI',  "bid" => 0.0006,  "bidSize" => 4000000 ),
array ("marketMakerId" =>'GTSM',  "bid" => 0.0006,  "bidSize" => 650000 ),
array ("marketMakerId" =>'NITE',  "bid" => 0.0005,  "bidSize" => 10000 ),
array ("marketMakerId" =>'NITE',  "bid" => 0.0005,  "bidSize" => 10000 ),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0001,  "bidSize" => 10000 ),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0002,  "bidSize" => 20000 ),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0003,  "bidSize" => 20000 ),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0004,  "bidSize" => 40000 ),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0078,  "bidSize" => 40000 ),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0074,  "bidSize" => 40000 )

);

См. Выше значение "bid" массива 0,0006 дважды в списке, теперь я хочу добавить код цвета для каждой строки массива из массива кодов цвета, у меня есть другой массив Colorмассив кодов, если достигнут последний цвет "Оливковый", тот же цвет будет применен ко всем оставшимся значениям ставки

$color = array("red", "green", "Yellow",'brown','olive');

Теперь я хочу получить исключенный вывод, как показано ниже

$level2_output = array(
array ("marketMakerId" =>'CSTI',  "bid" => 0.0006,  "bidSize" => 4000000, 'color'=>'red' ),
array ("marketMakerId" =>'GTSM',  "bid" => 0.0006,  "bidSize" => 650000, 'color'=>'red' ),
array ("marketMakerId" =>'NITE',  "bid" => 0.0005,  "bidSize" => 10000 , 'color'=>'green'),
array ("marketMakerId" =>'NITE',  "bid" => 0.0005,  "bidSize" => 10000 , 'color'=>'green'),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0001,  "bidSize" => 10000, 'color'=>'Yellow' ),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0002,  "bidSize" => 20000 , 'color'=>'brown'),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0003,  "bidSize" => 20000 , 'color'=>'olive'),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0004,  "bidSize" => 40000, 'color'=>'olive' ),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0078,  "bidSize" => 40000 , 'color'=>'olive'),
array ("marketMakerId" =>'MAXM',  "bid" => 0.0074,  "bidSize" => 40000 , 'color'=>'olive')

);

Если применено одинаковое значение ставки того же цвета, Если применено другое значение ставки, чем другой цвет, см. Массив вывода, в котором вы можете это понять,

Пожалуйста, помогите нам

Я пробовал вот так, также эта часть - огромный код, я выкладываю только то, что я пробовал

array_multisort($value_bid, SORT_NUMERIC,SORT_DESC, $qty_bid,SORT_NUMERIC, SORT_DESC, $bid_level2);
// Obtain a Bid list of columns with sorting desc Ends

$colorMap[0] = 'red';
$colorMap[1] = 'green';
$colorMap[2] = 'Yellow';
$colorMap[3] = 'brown';

$keys   = array_keys($count_bid);
rsort($keys);
//print_r($keys);
$array3_bid = array();
$j=0;
for($i=0;$i<count($keys);$i++)
{
    if(!empty($colorMap[$j]))
    {
        $array3_bid[$keys[$i]] = $colorMap[$j];
        $j++;
    } else {
        $j=0;
        $array3_bid[$keys[$i]] = $colorMap[$j];
        $j++;
    }
}

Ответы [ 4 ]

1 голос
/ 10 июня 2019

Это просто сохраняет карту ставок в соответствии с цветом этой ставки. Я использую ставку в качестве ключа (я преобразую ее в строку) и проверяю, установлена ​​ли она уже, если нет, добавляет следующий цвет в соответствии с уже использованным количеством ...

$level2 = array(
    array ("marketMakerId" =>'CSTI',  "bid" => 0.0006,  "bidSize" => 4000000 ),
    array ("marketMakerId" =>'NITE',  "bid" => 0.0005,  "bidSize" => 10000 ),
    array ("marketMakerId" =>'MAXM',  "bid" => 0.0001,  "bidSize" => 10000 ),
    array ("marketMakerId" =>'GTSM',  "bid" => 0.0006,  "bidSize" => 650000 )

);
$color = array("red", "green", "Yellow",'brown','olive');

$map = array();
foreach ( $level2 as &$element ) {
    $bid = (string)$element['bid'];
    if ( !isset($map[$bid]) ) {
        $map[$bid] = $color[count($map)%5];
    }
    $element['color'] = $map[$bid];
}

print_r($level2);

, который дает (только с некоторыми тестовыми данными) ...

Array
(
    [0] => Array
        (
            [marketMakerId] => CSTI
            [bid] => 0.0006
            [bidSize] => 4000000
            [color] => red
        )

    [1] => Array
        (
            [marketMakerId] => NITE
            [bid] => 0.0005
            [bidSize] => 10000
            [color] => green
        )

    [2] => Array
        (
            [marketMakerId] => MAXM
            [bid] => 0.0001
            [bidSize] => 10000
            [color] => Yellow
        )

    [3] => Array
        (
            [marketMakerId] => GTSM
            [bid] => 0.0006
            [bidSize] => 650000
            [color] => red
        )

    [4] => Array
        (
            [marketMakerId] => GTSM
            [bid] => 0.0002
            [bidSize] => 650000
            [color] => brown
        )

    [5] => Array
        (
            [marketMakerId] => GTSM
            [bid] => 0.0004
            [bidSize] => 650000
            [color] => olive
        )

    [6] => Array
        (
            [marketMakerId] => GTSM
            [bid] => 0.0003
            [bidSize] => 650000
            [color] => red
        )

)
1 голос
/ 10 июня 2019

Вы можете создать ассоциативный массив с цветом bid => и зациклить основной массив и добавить цвет в подмассив.

$bids = array_unique(array_column($level2, 'bid'));
$bids = array_combine($bids, array_slice($color,0,count($bids)));

/*
$bids are now:
array(3) {
  ["0.0006"]=>
  string(3) "red"
  ["0.0005"]=>
  string(5) "green"
  ["0.0001"]=>
  string(6) "Yellow"
}
*/

foreach($level2 as &$sub){
    $sub["color"] = $bids[(string)$sub['bid']];
}

var_dump($level2);

Выход:

array(4) {
  [0]=>
  array(4) {
    ["marketMakerId"]=>
    string(4) "CSTI"
    ["bid"]=>
    float(0.0006)
    ["bidSize"]=>
    int(4000000)
    ["color"]=>
    string(3) "red"
  }
  [1]=>
  array(4) {
    ["marketMakerId"]=>
    string(4) "GTSM"
    ["bid"]=>
    float(0.0006)
    ["bidSize"]=>
    int(650000)
    ["color"]=>
    string(3) "red"
  }
  [2]=>
  array(4) {
    ["marketMakerId"]=>
    string(4) "NITE"
    ["bid"]=>
    float(0.0005)
    ["bidSize"]=>
    int(10000)
    ["color"]=>
    string(5) "green"
  }
  [3]=>
  &array(4) {
    ["marketMakerId"]=>
    string(4) "MAXM"
    ["bid"]=>
    float(0.0001)
    ["bidSize"]=>
    int(10000)
    ["color"]=>
    string(6) "Yellow"
  }
}

https://3v4l.org/UcdSi


В комментариях ОП выражает желание зациклить цвета, если он превышает 5 цветов.
Я создаю новый массив с цветами нужной длины путем слияния array_fill из $ color.

$color = array("red", "green", "Yellow",'brown','olive');


$bids = array_unique(array_column($level2, 'bid'));
$color = call_user_func_array('array_merge',array_fill(0,(count($bids)/5)+1,$color));
// $color = array("red", "green", "Yellow",'brown','olive',"red", "green", "Yellow",'brown','olive',"red", "green", "Yellow",'brown','olive');


$bids = array_combine($bids, array_slice($color,0,count($bids)));

foreach($level2 as &$sub){
    $sub["color"] = $bids[(string)$sub['bid']];
}

var_dump($level2);

См. Пример циклических цветов:
https://3v4l.org/DddeP

1 голос
/ 10 июня 2019

Вы можете использовать foreach и делать вещи с некоторыми условиями, как показано ниже,

$i     = 0;
foreach ($level2 as $k => &$v) {
    if (empty($bid)) {
        $bid = $v['bid'];
    } else if ($bid != $v['bid']) {
        $bid = $v['bid'];
        $i++;
    }
    // checking if $i > count of color then reset to 0
    if (($i + 1) > count($color)) {
        $i = 0;
    }
    $v['color'] = $color[$i];
}
print_r($level2);die;

Я сбрасываю цвета, если они достигли последнего цвета.

Демо .

0 голосов
/ 10 июня 2019

Используя этот код, который вы указали, обратите внимание, что если размер вашего массива превышает 4 элемента, у нескольких элементов будет один и тот же цветовой код, независимо от различий в ставке:

else {
        $j=0; //resetting the iteration token here results in multiple bid having the same color
        $array3_bid[$keys[$i]] = $colorMap[$j];
        $j++;
    }

Но если проблема не в этом, решение будет иметь другой массив, который отслеживает добавленный цвет:

$mappedBidAndColor = new Array();//note this variable
if(!empty($colorMap[$j])) {
    //Check if the bid has been coloured 
    if (array_key_exists($mappedBidAndColor[$array3_bid[$keys[$i]]])) {
        //Pull the color and use it instead of assigning a new color
        $array3_bid[$keys[$i]] = $mappedBidAndColor[$array3_bid[$keys[$i]]];
    }
    else {
        $array3_bid[$keys[$i]] = $colorMap[$j];
        $mappedBidAndColor[$array3_bid[$keys[$i]]] = $colorMap[$i];//store the bid and the assigned color for future reference
        $j++;
    }
}

Отредактируйте переменные в соответствии с вашим кодом, поскольку я не смог отследить все ваши переменные. Но это даст вам идею, которая вам нужна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...