Я делаю выпадающую систему платежной системы и имею проблемы с optgroup для мобильных платежей. Это пример ответа от 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"}
Итак, где [‘type’] === 20 && [‘mobile’]! = 0 мне нужно для создания optgroup с меткой мобильных платежей ..
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++;
}
}
}
Поэтому моя проблема — создать правильную группу, не повторяя ее для каждого мобильного платежа в каждом регионе (континенте).
Должно быть что-то вроде этого: https://jsfiddle.net/atc67mLe/24/
Спасибо.
Если вам не нужна optgroup в середине ваших опций, вы можете просто добавить ее в конце.
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>';
}
}
Это не проверено, но вы поняли идею. Просто разделите мобильные в новый массив и последовательно просматривайте их для создания optgroup.
Я, вероятно, попытался бы уточнить исходный запрос SQL, чтобы получить более полезный набор результатов, а не запускать кучу дополнительных запросов в цикле для каждого параметра. Было бы лучше иметь объединение в вашем первом запросе SQL, чтобы получить имя метода оплаты одновременно.
проблема в вашем коде заключается в том, что вы упаковываете каждую опцию мобильного платежа в optgroup. Что вам нужно сделать, это сгруппировать все варианты мобильных платежей в массиве или в строке, а затем обернуть их все с optgroup, прежде чем распечатать их
вот пример …
$options = '';
$mobileOptions = '';
foreach ($regions as $region) {
$typeId = $region['type'];
if ($typeId == 20 && $region['mobile'] != 0) {
$label = $db->getMobileById($region['mobile']);
$mobileOptions .= sprintf('<option value="%s_%s">%s</option>',$typeId,$region['mobile'],$label);
} else {
$label = $db->getTypeById($typeId);
$options .= sprintf('<option value="%s">%s</option>',$typeId,$label);
}
}
echo $options;
if ($mobileOptions)
echo '<optgroup label="Mobile payments">'.$mobileOptions.'</optgroup>';