2016-07-22 17 views
0

私はこのようになります配列があります。再注文アレイ

Array 
(
[0] => Array 
    (
     [amount] => 75.00 
     [name] => CLIENT1 
     [week] => 22 
    ) 

[1] => Array 
    (
     [amount] => 945.00 
     [name] => CLIENT1 
     [week] => 23 
    ) 

[2] => Array 
    (
     [amount] => 45.00 
     [name] => CLIENT1 
     [week] => 24 
    ) 
... 

[15] => Array 
    (
     [amount] => 45.00 
     [name] => CLIENTX 
     [week] => 22 
    ) 

[16] => Array 
    (
     [amount] => 15.00 
     [name] => CLIENTX 
     [week] => 22 
    ) 
// HAS NO VALUE IN WEEK 23 BUT TWO IN WEEK 22!!! 
[17] => Array 
    (
     [amount] => 73.00 
     [name] => CLIENTX 
     [week] => 24 
    ) 

は私がしようと、この

Array 
(
['weeks'] => Array (22,23,24) //ALL WEEKS FOUND SOMEWHERE 
['series'] => Array 
      (
      [0] => Array 
       (
       ['name'] => 'CLIENT1' 
       ['data'] => Array (75.00, 945.00, 45.00) 
       ) 
      [1] => Array 
       (
       ['name'] => 'CLIENTX' 
       ['data'] => Array (60.00, 0, 73.00) 
       ) 
     ) 
) 

まずように見えるのアレイを必要とし

これはむしろ論理的な問題であり、プログラミングの問題ではありませんが、私はずっとそれを見ていません。

['weeks'] => Array (22,23,24)は問題ではありませんが、残りは本当にあります。

私がこれまでに得た最も近いがこれです:

$clientArray = array(); 
$weekAmount = array(); 
foreach($hours as $hour){ 
    /* For better readability */ 
    $client = $hour['name']; 
    $amount = $hour['amount']; 
    $week = $hour['week']; 

    if(!array_key_exists($week, $weekAmount)){ 
     $weekAmount[$week] = 0; 
    } 
    $weekAmount[$week] = $amount; 
    $clientArray[$client] = $weekAmount; 
    ksort($clientArray[$client]); // to order by weeks 
} 

しかし、これは同じ週から値を追加しないと、私はこれをループする必要が再び、私は "を見つける方法がわかりません「逃した」週を設定し、0をその値に設定します。

私は自分自身を明確に説明してくれることを願っています。

答えて

1

あり、これよりもより効率的な方法でもよいが、少なくとも、それが動作する必要があります。

<?php 

$input = array(
    array('amount' => 75.00, 
      'name' => 'CLIENT1', 
      'week' => 22), 
    array('amount' => 945.00, 
      'name' => 'CLIENT1', 
      'week' => 23), 
    array('amount' => 45.00, 
      'name' => 'CLIENT1', 
      'week' => 24), 
    array('amount' => 45.00, 
      'name' => 'CLIENTX', 
      'week' => 22), 
    array('amount' => 15.00, 
      'name' => 'CLIENTX', 
      'week' => 22), 
    array('amount' => 73.00, 
      'name' => 'CLIENTX', 
      'week' => 24), 
); 

$weeks = array(); 
$names = array(); 
foreach ($input as $v) { 
    if (!isset($weeks[$v['week']])) 
     $weeks[$v['week']] = array(); 
    if (!isset($names[$v['name']])) 
     $names[$v['name']] = array(); 
    if (!isset($names[$v['name']][$v['week']])) 
     $names[$v['name']][$v['week']] = 0; 
    $names[$v['name']][$v['week']] += $v['amount']; 
} 

$output = array('weeks' => array(), 'series' => array()); 
foreach ($weeks as $week=>$values) { 
    $output['weeks'][] = $week; 
} 
foreach ($names as $name=>$data) { 
    $serie = array(); 
    $serie['name'] = $name; 
    foreach ($weeks as $week=>$values) { 
     if (isset($data[$week])) 
      $serie['data'][] = $data[$week]; 
     else 
      $serie['data'][] = 0; 
    } 
    $output['series'][] = $serie; 
} 

echo '<pre>'; print_r($output); 
?> 

戻り値:

Array 
(
    [weeks] => Array 
     (
      [0] => 22 
      [1] => 23 
      [2] => 24 
     ) 
    [series] => Array 
     (
      [0] => Array 
       (
        [name] => CLIENT1 
        [data] => Array 
         (
          [0] => 75 
          [1] => 945 
          [2] => 45 
         ) 

       )  
      [1] => Array 
       (
        [name] => CLIENTX 
        [data] => Array 
         (
          [0] => 60 
          [1] => 0 
          [2] => 73 
         )  
       )  
     )  
) 
+0

真のヒーローは...作品の魅力のように!どうもありがとうございます。私は半日かかったとは信じられない...! – PrimuS

+0

あなたは大歓迎です;) 'weeks'配列をソートするのを忘れてしまったことに気付きました。 – roberto06