2016-06-10 1 views
0

Ich arbeite an CakePHP-Projekt, wo ich die Berichte generieren muss. Ich habe zwei Tabellen, eine Tabelle speichert den Wert des Kunden und eine andere Tabelle speichert den Wert der Leads, die jedem Benutzer zugewiesen sind. Jeder Lead hat Status. Ich möchte den Zähler von progressleads zu erhöhen, wenn Status 0 ist, wenn Status 1 ist dann Zähler von wonleads erhöht werden sollte, und so weiter ...inkrementieren zähler status weise in php foreach

Ich trete zwei Tabellen und Array immer wie dieses =>

Array 
(
    [0] => Array 
     (
      [Customer] => Array 
       (
        [id] => 14 
        [name] => ABC 
       ) 

      [Opportunity] => Array 
       (
        [status] => 0 
        [value] => 50000 
       ) 

     ) 

    [1] => Array 
     (
      [Customer] => Array 
       (
        [id] => 14 
        [name] => ABC 
       ) 

      [Opportunity] => Array 
       (
        [status] => 1 
        [value] => 10000 
       ) 

     ) 

    [2] => Array 
     (
      [Customer] => Array 
       (
        [id] => 14 
        [name] => ABC 
       ) 

      [Opportunity] => Array 
       (
        [status] => 1 
        [value] => 7500 
       ) 

     ) 

    [3] => Array 
     (
      [Customer] => Array 
       (
        [id] => 15 
        [name] => DEF 
       ) 

      [Opportunity] => Array 
       (
        [status] => 0 
        [value] => 45000 
       ) 

     ) 

    [4] => Array 
     (
      [Customer] => Array 
       (
        [id] => 19 
        [name] => ST 
       ) 

      [Opportunity] => Array 
       (
        [status] => 2 
        [value] => 50000 
       ) 

     ) 

    [5] => Array 
     (
      [Customer] => Array 
       (
        [id] => 16 
        [name] => TEST 
       ) 

      [Opportunity] => Array 
       (
        [status] => 2 
        [value] => 1000000 
       ) 

     ) 

    [6] => Array 
     (
      [Customer] => Array 
       (
        [id] => 19 
        [name] => ST 
       ) 

      [Opportunity] => Array 
       (
        [status] => 0 
        [value] => 1000 
       ) 

     ) 

    [7] => Array 
     (
      [Customer] => Array 
       (
        [id] => 14 
        [name] => ABC 
       ) 

      [Opportunity] => Array 
       (
        [status] => 0 
        [value] => 
       ) 

     ) 

) 

Von diesem Array möchte ich einen Datensatz für jeden Benutzer mit insgesamt Leads, inprogress Leads, gewonnen Leads Zähler. Ich habe folgenden Code versucht: -

$customerdetails = array(); 
      $totalopp = 0; 
      $progressopp = 0; 
      $oppval = 0; 
      $wonopp = 0; 
      $lostopp = 0; 
      $billedopp = 0; 
      $onholdopp = 0; 
      $newcustid = NULL; 
      foreach($customer as $k => $val){ 
       $custid = $val["Customer"]["id"]; 
       if($newcustid != $custid){ 
        $oppstatus = $val["Opportunity"]["status"]; 
        $oppval += $val["Opportunity"]["opo_value"]; 
        $totalopp++; 
        if($oppstatus == 0){ 
         $progressopp++; 
        } 
        if($oppstatus == 1){ 
         $wonopp++; 
        } 
        if($oppstatus == 2){ 
         $lostopp++; 
        } 
        if($oppstatus == 3){ 
         $billedopp++; 
        } 
        if($oppstatus == 4){ 
         $onholdopp++; 
        } 
        $newcustid = $custid; 
       } 
        $customerdetails[$custid]["customername"] = $val["Customer"]["customer_name"]; 
        $customerdetails[$custid]["opportunities"] = $totalopp; 
        $customerdetails[$custid]["value"] = $oppval; 
        $customerdetails[$custid]["inprogress"] = $progressopp; 
        $customerdetails[$custid]["won"] = $wonopp; 
        $customerdetails[$custid]["lost"] = $lostopp; 
        $customerdetails[$custid]["billed"] = $billedopp; 
        $customerdetails[$custid]["onhold"] = $onholdopp; 

      } 

Nach dem Druck $ Kundendetails Array i folgende Ergebnisse sind immer =>

Array 
(
    [14] => Array 
     (
      [customername] => ABC 
      [opportunities] => 6 
      [value] => 1146000 
      [inprogress] => 4 
      [won] => 0 
      [lost] => 2 
      [billed] => 0 
      [onhold] => 0 
     ) 

    [15] => Array 
     (
      [customername] => DEF 
      [opportunities] => 2 
      [value] => 95000 
      [inprogress] => 2 
      [won] => 0 
      [lost] => 0 
      [billed] => 0 
      [onhold] => 0 
     ) 

    [19] => Array 
     (
      [customername] => ST 
      [opportunities] => 5 
      [value] => 1146000 
      [inprogress] => 3 
      [won] => 0 
      [lost] => 2 
      [billed] => 0 
      [onhold] => 0 
     ) 

    [16] => Array 
     (
      [customername] => TEST 
      [opportunities] => 4 
      [value] => 1145000 
      [inprogress] => 2 
      [won] => 0 
      [lost] => 2 
      [billed] => 0 
      [onhold] => 0 
     ) 

) 

Wie Sie sich nur 4 Leitungen zugeordnet ABC sehen können, aber es zeigt Opportunities wie 6 werden die anderen Counter ebenfalls falsch angezeigt. Kann mir jemand helfen, was ich hier falsch mache?

Antwort

1

Ich denke, dass Sie hier falsche Logik anwenden. array_column wird den Trick machen. Siehe den folgenden Code.

<?php 

$customers=array_column($result,'customer'); 
$opportunity=array_column($result,'opportunity'); 

$finalResult=array(); 

foreach($customers as $k=>$customer) { 
    $opp=$opportunity[$k]; 
    if(!array_key_exists($customer["id"],$finalResult)) { 
     $finalResult[$customer["id"]]=array(); 
     $finalResult[$customer["id"]]["opportunities"]=0; 
     $finalResult[$customer["id"]]["value"]=0; 
     $finalResult[$customer["id"]]["inprogress"]=0; 
     $finalResult[$customer["id"]]["won"]=0; 
     $finalResult[$customer["id"]]["lost"]=0; 
     $finalResult[$customer["id"]]["billed"]=0; 
     $finalResult[$customer["id"]]["onhold"]=0; 
    } 
    $finalResult[$customer["id"]]["customerid"]=$customer["id"]; 
    $finalResult[$customer["id"]]["customername"]=$customer["name"]; 
     $finalResult[$customer["id"]]["opportunities"]++; 
     $finalResult[$customer["id"]]["value"]+=$opp["value"]; 
     if($opp["status"]==0) { 
      $finalResult[$customer["id"]]["inprogress"]++; 
     } 
     if($opp["status"]==1) { 
      $finalResult[$customer["id"]]["won"]++; 
     } 
     if($opp["status"]==2) { 
      $finalResult[$customer["id"]]["lost"]++; 
     } 
     if($opp["status"]==3) { 
      $finalResult[$customer["id"]]["billed"]++; 
     } 
     if($opp["status"]==4) { 
      $finalResult[$customer["id"]]["onhold"]++; 
     }  
} 

?> 

Sie müssen nur die Kundenspalte und die Opportunity-Spalte einzeln abrufen und dann die Kundenspalte durchlaufen.

Jetzt, wenn Sie durchqueren, überprüfen Sie zuerst, ob Sie diesen Kunden bereits gefunden haben oder nicht, indem Sie Werte in $finalResult Array speichern. Wenn ja, dann erhöhen Sie die Zähler entsprechend, wenn Sie kein Array erstellen, und inkrementieren Sie den Zähler entsprechend.

Ich denke, das wird den Trick tun.

Output-Array könnte wie folgt aussehen:

Array 
(
    [14] => Array 
     (
      [opportunities] => 4 
      [value] => 13500 
      [inprogress] => 2 
      [won] => 2 
      [lost] => 0 
      [billed] => 0 
      [onhold] => 0 
      [customerid] => 14 
      [customername] => ABC 
     ) 

    [15] => Array 
     (
      [opportunities] => 1 
      [value] => 45000 
      [inprogress] => 1 
      [won] => 0 
      [lost] => 0 
      [billed] => 0 
      [onhold] => 0 
      [customerid] => 15 
      [customername] => DEF 
     ) 

    [19] => Array 
     (
      [opportunities] => 2 
      [value] => 51000 
      [inprogress] => 1 
      [won] => 0 
      [lost] => 1 
      [billed] => 0 
      [onhold] => 0 
      [customerid] => 19 
      [customername] => ST 
     ) 

    [16] => Array 
     (
      [opportunities] => 1 
      [value] => 100000 
      [inprogress] => 0 
      [won] => 0 
      [lost] => 1 
      [billed] => 0 
      [onhold] => 0 
      [customerid] => 16 
      [customername] => TEST 
     ) 

) 
+0

Danke für Ihre Hilfe aber können Sie mir bitte sagen, was ist $ Ergebnis enthält? – user3327608

+0

'$ finalResult' ist nur ein Array, das das Endergebnis enthält. Überprüfen Sie die aktualisierte Antwort für das Array-Format. –

+0

Dies ist die erste Platte, die ich so bekam: - Array ( [14] => Array ( [Möglichkeiten] => 1 [Wert] => 50000 [inprogress] => 1 [gewonnen] => 0 [verloren] => 0 [Rechnung] => 0 [OnHold] => 0 [customerid] => 14 [Kundenname] => ABC ) – user3327608

0

Was ist Ihre Logik dies hinter tun:

if($newcustid != $custid){ 
    $totalopp++; 
} 

Und Sie zuweisen $ newcustid auf null. Ich denke, dass dieser Zustand zu falschen Chancen führt.

+0

Wenn beide zu diesem Zeitpunkt nicht gleich Ich habe die Zählerwerte zu erhöhen. Ich möchte Zählerwerte pro Benutzer erhalten. Ich bin neu in PHP. Bitte helfen Sie mir – user3327608