PHP Optgroup Algoritma Sorunsalı
Başlık pek olmadı galiba, şimdiden kusura bakmayın,
Sorunum şu sekilde, DB'den çekilen verileri bir Select
içerisinde listeliyorum. DB Sütünlarından biri Date
sütunu.
Select
içerisindeki verileri Date
sütünuna göre (Ay-Yıl) olarak gruplamak <optgorup>
kullanmak istiyorum ancak bir türlü olmadı.
PHP kod örneğim aşağıdaki gibi;
$DataCount = 1;
foreach($SQLData as $Data):
echo "<option value='".$Data -> Data_ID."'>";
echo sprintf("%04s", $DataCount);
echo "[".$Data -> Data_Name."]";
echo "[".$Data -> Data_Date."]";
echo "[".$Data -> Data_Status."]";
echo "</option>\n";
$DataCount++;
endforeach;
Merhaba. Ekrana yazdırma işleminden önce gruplama işlemini gerçekleştirebiliriz.
<?php
// Gruplanmış haldeki verileri tutacak boş bir array oluşturuyorum:
$optionGroups = [];
// Gruplama işini ayrı bir foreach döngüsünde yapıyorum:
$dataCount = 1;
foreach($sqlData as $data) {
// Sadece daha iyi görmek için verileri değişkenlere alıyorum.
$thisDataId = $data->Data_ID;
$thisDataCount = sprintf("%04s", $dataCount++);
$thisDataName = $data->Data_Name;
$thisDataDate = $data->Data_Date;
$thisDataStatus = $data->Data_Status;
// MySQL'den Date türünde gelen veriyi parçalayıp ay ve yıl bilgisini alıyorum.
$thisDateParts = explode("-", $thisDataDate);
$monthOfThisDate = $thisDateParts[1];
$yearOfThisDate = $thisDateParts[0];
// Ay ve yıl olarak gruplandıracağım için bu iki veriyi birleştiriyorum. Örn: "5-2022"
$groupName = "$monthOfThisDate - $yearOfThisDate";
// Eğer daha önce bu isimli bir grup oluşturulmamışsa şimdi boş halde ben oluşturuyorum:
if(!isset($optionGroups[$groupName])) $optionGroups[$groupName] = [];
// Verileri bu gruba ekliyorum:
$optionGroups[$groupName][] = (object)[
"value"=>$thisDataId,
"text"=>"$thisDataCount[$thisDataName][$thisDataDate][$thisDataStatus]"
];
}
// Veriler gruplanmış halde $optionGroups içinde duruyor.
// $optionGroups şu anda her elemanı object olan bir named array.
// Verileri html kodu şekline getiriyorum:
foreach($optionGroups as $groupName=>$groupItems) {
echo "<optgroup label='$groupName'>";
foreach($groupItems as $item) echo "<option value='{$item->value}'>{$item->text}</option>";
echo "</optgroup>";
}
Kodları test etmedim. Hatalar olabilir.