Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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....

share|improve this question

5 Answers 5

up vote 1 down vote accepted

(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;.

share|improve this answer
    
Why sort the array? The OP never asked for that. –  brian_d Aug 12 '11 at 20:55
    
Guess my brain did some sort of auto-sorting… I checked again and indeed, the desired output was not sorted. Fixed my answer. –  Shi Aug 12 '11 at 21:01

There are two approaches: simple and 'right' :)

Simple approach:

foreach ($array as $machine_key=>$machine){
    $solder_ball = $machine['SOLDER_BALL']/ $machine['DEFECT_QTY']*100;
    echo "$machine_key ({$machine['REJECT_RATE']})";
    echo " -Machine {$machine['MACHINE_NAME']};
    echo " -Feeder {$machine['FEEDER_SLOT']}";
    echo "  SOLDER INSUFFICIENT ( $solder_ball%)";
    //...and so on...//
}

'Right' approach

Have class Machine:

class Machine{
    $protected $name, $feeder, $solder_insufficient; //..all youneed to output here..//
    function__constructor(Array $params){
        $this->name = $params['MACHINE_NAME'];
        $this->solder_insufficient = $machine['SOLDER_BALL']/ $machine['DEFECT_QTY']*100;
        //..all other params here...//
    }

    function output(){
        echo "{$this->key} ({$this->reject_rate)";
        echo " -Machine {$this->key}";
        echo " -Feeder {$this->feeder}";
        echo "  SOLDER INSUFFICIENT ( {$this->solder_insufficient}%)";
        //....and so on ..//
    }
}

The benefit ofusing 'right' approach is that youcan reuse your class multiple times, and adjust output in all placesthat require it by modifying code at single place only.

share|improve this answer

this could work

foreach($arr as $id => $item) {
  printf('%s ( %s )
  -Machine: %s
  -Feeder: %s
',
  $id,
  $item['REJECT_RATE'],
  $item['MACHINE_NAME'],
  $item['FEEDER_NAME']);
  foreach($item as $key => $val) {
    if(!in_array($key, array('REJECT_RATE', 'MACHINE_NAME', 'FEEDER_NAME', 'REJECT_QTY'))) {
      printf("    %s ( %s )\n", $key, 100*$val/$item['REJECT_QTY']);
    }
  }
}
share|improve this answer

Utilize a foreach loop that loops through each object in the array and outputs them accordingly. The example below should be modified to fit your styling, but it should give you the basis to get started:

<table>
<thead>
    <tr><th>Item</th><th>Value</th></tr>
</thead>
<tbody>
<?php
foreach ($myArray as $k => $v){
    echo "<tr><td>$k</td><td>$v</td></tr>";
}
?>
</tbody>
</table>
share|improve this answer
    
Yea I figured I could do something like that, I wasn't sure if there was an array_map type of function combined with some further formatting that would allow me to avoid using another loop in my script –  sadmicrowave Aug 12 '11 at 20:53

Use foreach to iterate through the values and format the output string as desired.

foreach( $your_array as $id => $details ) {
    foreach( $details as $key => $value ) {
        //format your desired output
    }
}
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.