Search code examples
phparraysmultidimensional-arrayimplodearray-map

implode php array into formatted text


I have this array:

array(122) { 
    ["1AB168820010"]=> array(3) { 
       ["MACHINE_NAME"]=> "L1XP2A"
       ["FEEDER_SLOT"]=> "114"
       ["REJECT_RATE"]=> float(0.0394) 
       ["DEFECT_QTY"]=> int(2) 
       ["SOLDER BALL"]=> int(2) 
    }  
    ["1AB037870031"]=> array(5) { 
       ["MACHINE_NAME"]=> "L2CP7A"
       ["FEEDER_SLOT"]=> "155"
       ["REJECT_RATE"]=> float(2.3022) 
       ["DEFECT_QTY"]=> int(39) 
       ["COMPONENT TOMBSTONED"]=> int(31) 
       ["SOLDER BALL"]=> int(2) 
       ["COMPONENT BILLBOARD"]=> int(6)
    } 
    ["1AB144890021"]=> array(7) { 
       ["MACHINE_NAME"]=> "L21P3A"
       ["FEEDER_SLOT"]=> "214"
       ["REJECT_RATE"]=> float(0.0225) 
       ["DEFECT_QTY"]=> int(8) 
       ["SOLDER INSUFFICIENT "]=> int(2) 
       ["SOLDER BAD"]=> int(2) 
       ["SOLDER BALL"]=> int(2) 
       ["COMPONENT MISSING"]=> int(1) 
       ["COMPONENT BILLBOARD"]=> int(1) 
    } 
    ["1AB144890033"]=> array(7) {
       ["MACHINE_NAME"]=> "L1CP7A"
       ["FEEDER_SLOT"]=> "234" 
       ["REJECT_RATE"]=> float(0.0142) 
       ["DEFECT_QTY"]=> int(7) 
       ["SOLDER INSUFFICIENT "]=> int(1) 
       ["SOLDER BAD"]=> int(1) 
       ["COMPONENT MISSING"]=> int(3) 
       ["COMPONENT SKEW"]=> int(1) 
       ["COMPONENT TOMBSTONED"]=> int(1) 
    }
    #...more
}

I need to loop through the array and create a string from the array output that looks like this but don't know the best way...please help

 1AB168820010 ( 0.0394% ) #<-this is the 'REJECT_RATE'
  -Machine: L1XP2A
  -Feeder: 114
     SOLDER BALL ( 100% ) #<-'SOLDER BALL' value (2) divided by 'DEFECT_QTY' (2) * 100
 ------------------------
 1AB037870031 ( 2.3022% ) 
  -Machine: L2CP7A
  -Feeder: 155
     COMPONENT TOMBSTONED ( 79.48% ) #<- ( 31 / 39 ) * 100
     COMPONENT BILLBOARD ( 15.38% )  #<- ( 6 / 39 ) * 100
     SOLDER BALL ( 5.12% ) #<- ( 2 / 39 ) * 100
 ------------------------
 1AB144890021 ( 0.0225% )
  -Machine: L2IP3A
  -Feeder: 214
     SOLDER INSUFFICIENT ( 25% )
     SOLDER BAD ( 25% )
     SOLDER BALL ( 25% )
     COMPONENT MISSING ( 12.5% )
     COMPONENT BILLBOARD ( 12.5% )
 ------------------------
 1AB144890033 ( 0.0142% )
  -Machine: L1CP7A
  -Feeder: 234
     SOLDER INSUFFICIENT ( 14.3% )
     SOLDER BAD ( 14.3% )
     COMPONENT MISSING ( 42.8% )
     COMPONENT SKEWED ( 14.3% )
     COMPONENT TOMBSTONED ( 14.3% )

My main issue I'm not sure how to handle is that I don't know the number of defects (i.e. COMPONENT MISSING, COMPONENT SKEWED, SOLDER BAD) per partnumber, how many defects (and what defects it has) will vary, therefore I can't just hard-code 'COMPONENT MISSING: [some calc]' into my foreach loop....


Solution

  • (Optionally, you can sort the array by its keys: ksort($array);.)

    Next, you iterate over each element and build the string:

    $output = '';
    foreach ($array as $key => $data) {
      $output .= $key . ' ( ' . number_format($data['REJECT_RATE'], 3) . '% )' . "\n";
      $output .= ' -Machine: ' . $data['MACHINE_NAME'] . "\n";
      $output .= ' -Feeder: ' . $data['FEEDER_SLOT'] . "\n";
      $output .= '  SOLDER BALL ( ' . number_format(2 / $data['DEFECT_QTY'] * 100, 0) . '% )'. "\n";
    
      // Add more calculation here…
    
      $output .= "------------------------\n";
    }
    

    And finally, you output the string: echo $output;.