2017-12-03 18 views
0

私はこの質問を先に投稿しましたが、ここで誰かが解決策に近づくのを助けましたが、必要なデータを表示するようにはできません。月にグループ化された売上総数を表示する

私は以下のような構造を有し、この配列$salesを持っている:

それは何
array(627) (

[0] => array(4) (
    [id]=> (int) 1 
    [name] => (string) Tesla 
    [total]=> (string) 24 
    [month] => (string) 4 
) 

[1] => array(4) (
    [id]=> (int) 1 
    [name] => (string) Tesla 
    [total]=> (string) 18 
    [month] => (string) 5 


[2] => array(4) (
    [id]=> (int) 1 
    [name] => (string) Tesla 
    [total]=> (string) 18 
    [month] => (string) 6 

[3] => array(4) (
    [id]=> (int) 2 
    [name] => (string) Audi 
    [total]=> (string) 16 
    [month] => (string) 4 
) 

[4] => array(4) (
    [id]=> (int) 2 
    [name] => (string) Audi 
    [total]=> (string) 18 
    [month] => (string) 5 

は、それが車の種類ごとに、各月の売上情報を格納しています。いくつかの月は売り上げがないので空白です。 私がやりたいことは、HTMLテーブルの下のような車と表示、販売の各タイプをループしている:

Car  Jan. Feb. Mar. Apr. May. Jun. Jul, Aug. Sept. Oct. Nov. Dec 
Tesla 0 0 0 24 18 18 0 0  0 0 0  0 
Audi  0 0 0 16 18 0 0 0  0 0 0  0 

問題があるそこに持っている場合は、私が持っている配列が唯一の月のNUMERとの合計を表示しますその月の売上高です。例えば、テスラの場合、4,5,6ヵ月しか売れていないし、9ヵ月余りが失われている。私が得た

助けました:

$result = []; 
foreach($sales as $sale) { 
    if(!isset($result[$sale['name']])) 
     $result[$sale['name']] = []; 

    if(!isset($result[$sale['name']][$sale['month']])) 
     $result[$sale['name']][$sale['month']] = $sale['total']; 
    else 
     $result[$sale['name']][$sale['month']] += $sale['total']; 
} 

これは結構ですが、どのように私はこの配列で今年の各月をマッピングするのですか?どのように私は販売なしで月間0を表示するのですか?

私はあなたにこれを手伝っていただければ幸いです。私は少し複雑です。

更新:

foreach($cars as $car){ 
     echo '<tr><td>'.$car .'</td>'; 
      for($i=1;$i<=12;$i++){ 
      if (isset($new[$i][$car])){ 
       echo '<td>'.$new[$i][$car] . '</td>'; 
      }else{ 
       echo '<td>'."0".'</td>'; 
      } 
     }  
     echo '</tr>'; 
} 
+0

アレイをコピーして貼り付けることができますか? 'Var_export($ sales);'とコピーしてその結果を私たちにコピーします。配列のすべての行を編集するのは非常に難しいです。 – Andreas

+0

あなたは私の答えに何かコメントすることはできませんか? – Andreas

+0

@アンドレアス私は本当に申し訳ありません、このソリューションをありがとう、非常にシンプルでわかりやすいです。 –

答えて

0

である内部配列になりますまず月を第1のキーとして新しい配列を作成し、次に車をキーとし、値を売上として新しいサブ配列を作成します。

次に、すべての車をarray_columnでつかみ、array_uniqueで重複をソートします。

次に、月をループし(1〜12)、月にdate()を出力します。
次に、車をループして値(売上高)を出力します。 PHPのテストのために

foreach($sales as $sale){ 
    $new[$sale["month"]][$sale["name"]] = $sale["total"]; 
} 

$cars = array_unique(array_column($sales, "name", "id")); 
$cars[] = "Sum"; // add a car named "Sum" for later use of displaying the sum 
//Var_dump($cars); 
echo "<table>\n<th>Car</th>"; 

for($i=1;$i<=12;$i++){ 
    echo "<th>" . date("M", strtotime("2017-$i-01")) . "</th>"; // create header 
    foreach($cars as $car){ // loop through the cars and add zero values to months if there is no sales on each car. 
     if(!isset($new[$i][$car])){ 
      $new[$i][$car] = 0; // add months with 0 values 
     } 
    } 
    $new[$i]["Sum"] = array_sum($new[$i]); // sum the month sales and add it to car "Sum" 
} 
ksort($new); // sort it on keys (months); 

//output each car in a table (including "Sum") using array_column and implode 
foreach($cars as $key => $car){ 
    If($car != "Sum"){ 
     echo "\n<tr><td><a href='$key'>$car</a></td><td>" . implode("</td><td>", array_column($new, $car)). "</td></tr>"; 
    }Else{ 
     echo "\n<tr><td>$car</td><td>" . implode("</td><td>", array_column($new, $car)). "</td></tr>"; 
    } 
} 

echo "</table>"; 


https://3v4l.org/tZNOK
は、実際の出力が何であるかを確認するには:
https://jsfiddle.net/gfjdcj4r/

編集は、array_sumを追加しました。
編集;追加されたHTMLテーブル 編集; array_columnの3番目のオプションを使用して、IDをアンカーとして追加しました。
これは$ carsのキーをidにします。
これはアンカーとして出力されます。

+0

これはかなりクリーンな解決策です月に合計を印刷するのに手伝ってください。 –

+0

私は月として最初のキーを使うので、array_sumを使って月合計を簡単に合計することができます。 @MegMeg – Andreas

+0

これは素晴らしいです、私はこのソリューションが好きです、ありがとう! –

0

はintialized値自体

+0

ありがとう、それは良いと思う、あなたは構文を少し私を助けてくれますか? –

-1

があなたの$を反復表示する他に、対応するインデックスの月が値を持っている場合、それを変更する0に初期化長さ12の配列を維持してください結果の配列と、すべての「車」のために、1から12まで、それはだ「車」に存在する場合、毎月のチェックのために反復は、ここでWその1つの方法は

$result = []; 
foreach($sales as $sale) { 
    if(!isset($result[$sale['name']])) 
     $result[$sale['name']] = []; 

    if(!isset($result[$sale['name']][$sale['month']])) 
     $result[$sale['name']][$sale['month']] = $sale['total']; 
    else 
     $result[$sale['name']][$sale['month']] += $sale['total']; 
} 

$totalSales = array(); 
foreach ($result AS $car=>$monthSales) { 
    print $car; 
    for($i=1;$i<=12;$i++) { 
     if(array_key_exists($i, $monthSales)) { 
      print $monthSales[$i]; // put here the names 
     } 
     else { 
      print "0"; 
     } 

     if(array_key_exists($i, $totalSales)) { 
      $totalSales[$i] = 0; 
     } 
     $totalSales[$i] += (isset($monthSales[$i])) ? $monthSales[$i] : 0; 
    } 
} 

for($i=1;$i<=12;$i++) { 
    if(array_key_exists($i, $totalSales)) { 
     print $totalSales[$i]; // put here the names 
    } 
    else { 
     print "0"; 
    } 
} 
+0

お世話になりました。ありがとうございました –

+0

毎月の合計サルを印刷してもらえますか?すべての車のために? –

+0

私はもっと多くのコードを追加しました。最初のforeachの印刷中に...そして数ヶ月間繰り返してから、合計を印刷します。 – shushu304

関連する問題