2016-05-26 4 views
0

Я пытаюсь отформатировать массив для объекта JSON, который поддерживает highcharts. Мой массив из базы данных выглядит следующим образом:PHP array reformat to highchart json ob

Array 
(
    [0] => Array 
     (
      [Group_ID] => 1 
      [Name] => A line graph 
      [month] => 4 
      [amount] => 7700 
     ) 

    [1] => Array 
     (
      [Group_ID] => 2 
      [Name] => B Line graph 
      [month] => 4 
      [amount] => 390 
     ) 

    [2] => Array 
     (
      [Group_ID] => 1 
      [Name] => A line graph 
      [month] => 5 
      [amount] => 5000 
     ) 

    [3] => Array 
     (
      [Group_ID] => 2 
      [Name] => B line graph 
      [month] => 5 
      [amount] => 210 
     ) 
) 

Мне нужно создать массив, как это, чтобы иметь возможность создать highchart совместимый объект JSON:

Array 
(
    [0] => Array 
     (
      [name] => A revenue 
      [data] => Array 
       (
        [4] => 7700 //amount for the fourth month 
        [5] => 5000 //amount for the fifth month 
       ) 
     ) 

    [1] => Array 
     (
      [name] => B revenue 
      [data] => Array 
       (
        [4] => 390 //amount for the fourth month 
        [5] => 210 //amount for the fifth month 
       ) 
     ) 
) 

мне удалось придумать с этим массив с помощью моего Еогеасп, но я не могу показаться, чтобы найти способ, чтобы сделать это правильно:

Array 
(
    [0] => Array 
     (
      [name] => A line graph 
      [amount] => 7700 
      [month] => 4 
     ) 

    [1] => Array 
     (
      [name] => B line graph 
      [amount] => 390 
      [month] => 4 
     ) 

    [2] => Array 
     (
      [name] => A line graph 
      [amount] => 5000 
      [month] => 5 
     ) 

    [3] => Array 
     (
      [name] => B line graph 
      [amount] => 210 
      [month] => 5 
     ) 

) 

Мой Еогеасп:

foreach ($data as $key => $value) { 
     $r[] = [ 
      'name' => $value['Line_GraphName'], 
      'data' => $value['amount'], 
      'month' => $value['month'] 
     ]; 
} 
+1

AbraCadaver имеет правильный ответ, я бы просто укажите для будущих ссылок в своих циклах foreach, не получите ключ $, если вы не собираетесь его использовать. Вы просто тратите ресурсы на тот момент. Маленькая вещь, конечно. –

+0

Спасибо, что Дойл Льюис, понятия не имел об этом: 0 – chapskev

ответ

3

Вы можете создать его очень просто, как это:

foreach ($data as $value) { 
    $r[$value['Group_ID']]['name'] = $value['Line_GraphName']; 
    $r[$value['Group_ID']]['data'][$value['month']] = $value['amount']; 
} 
  • Loop и создать результат с Group_ID как ключ и добавьте name ключ и значение
  • Добавить data массив и добавить month в и amount в качестве значения

Если вам не нравится Group_ID, как ключ и хотите переиндексировать:

$r = array_values($r); 
0

Решение с использованием array_walk и array_values функции:

$result = []; 
array_walk($data, function($v) use(&$result) { 
    $key = $v['Group_ID'] . $v['Name'][0]; // compound key: "group_id + revenue's prefix" 
    if (!isset($result[$key])) { 
     $result[$key] = ['name' => $key[1] . " Revenue", 'data' => [$v['month'] => $v['amount']]]; 
    } else { 
     $result[$key]['data'][$v['month']] = $v['amount']; 
    } 
}); 

print_r(array_values($result)); 

Выход:

Array 
(
    [0] => Array 
     (
      [name] => A Revenue 
      [data] => Array 
       (
        [4] => 7700 
        [5] => 5000 
       )  
     )  
    [1] => Array 
     (
      [name] => B Revenue 
      [data] => Array 
       (
        [4] => 390 
        [5] => 210 
       ) 
     ) 
)