Search code examples
phpforeachpaymentoptgroup

PHP Optgroup in Foreach


i'm on making payment system dropdown system, and have issue, with optgroup for mobile payments. This is example, of response from MySQL.

[17]=>
array(5) {
["id"]=>
string(2) "34"
["region"]=>
string(1) "1"
["type"]=>
string(2) "18"
["mobile"]=>
string(1) "0"
["system"]=>
string(1) "1"
}
[18]=>
 array(5) {
["id"]=>
string(2) "35"
["region"]=>
string(1) "1"
["type"]=>
string(2) "19"
["mobile"]=>
string(1) "0"
["system"]=>
string(1) "1"
 }
[19]=>
array(5) {
["id"]=>
string(2) "36"
["region"]=>
string(1) "1"
["type"]=>
string(2) "20"
["mobile"]=>
string(1) "1"
["system"]=>
string(1) "1"
}
[20]=>
array(5) {
["id"]=>
string(2) "37"
["region"]=>
string(1) "1"
["type"]=>
string(2) "20"
["mobile"]=>
string(1) "2"
["system"]=>
string(1) "1"
}
[21]=>
array(5) {
["id"]=>
string(2) "38"
["region"]=>
string(1) "1"
["type"]=>
string(2) "20"
["mobile"]=>
string(1) "3"
["system"]=>
string(1) "1"
}

So where ['type'] === 20 && ['mobile'] != 0 i need for making optgroup with label mobile payments..

if ( ! empty ( $regions ) && $regions !== NULL ) {

    $array = array();

    $im = 0;
    $i = 0;

    var_dump( $regions );

    foreach ( $regions as $key => $region ) {

        if ( (int) $region['mobile'] === 0 ) {
            $type  = $db->getTypeById( (int) $region['type'] );
            $value = $region['type'];

            echo "<option value='{$value}'>{$type}</option>";

        } else {

            //if ( $i < 1 )
            //echo '<optgroup label="Mobile payments">';

            $type  = $db->getMobileById( (int) $region['mobile'] );
            $value = $region['type'] . '_' . $region['mobile'];

            echo "<option value='{$value}'>{$type}</option>";

            //if ( $i <= $im )
            //echo '</optgroup>';

            $i++;

        }

    }

}

My dropdown

So my problem is to make proper group without repeating it on every mobile payments in each region (continent)

Should be soemthing like this: https://jsfiddle.net/atc67mLe/24/

Thank you.


Solution

  • If you don't need the optgroup in the middle of your options, you could just add it at the end.

    if (!empty($regions)) {
    
        $mobileOptions = [];
    
        // Print normal options
        foreach ($regions as $region) {
    
            $typeId = $region['type'];
    
            if ($typeId == 20 && $region['mobile'] != 0) {
                $mobileOptions[] = $region;
            } else {
                $label = $db->getTypeById($typeId);
                echo "<option value='{$typeId}'>{$label}</option>";
            }
        }
    
        // Print mobile options
        if (!empty($mobileOptions)) {
            echo '<optgroup label="Mobile payments">';
    
            foreach ($mobileOptions as $region) {
    
                $mobileId = $region['mobile'];
                $typeId = $region['type'];
                $label  = $db->getMobileById($mobileId);
    
                echo "<option value=\"{$typeId}_{$mobileId}\">{$label}</option>";
            }
            echo '</optgroup>';
        }
    }
    

    This is untested, but you get the idea. Just separate the mobile ones into a new array and loop through them to make the optgroup afterwards.

    I would probably try to refine the initial SQL query though, to retrieve a more usable set of results rather than running a bunch of extra queries in the loop for every option. It would be better to have a join in your first SQL query, to get the payment method name at the same time.