1

PDO のfetchAll()方法に従って、次のように、オプションを含むドロップダウンを生成するために使用する、データベースからの都市の 2 次元配列があります。

foreach($option as $city) {
    echo '<option value="'. $city['city_id'] . '">' . $city['city_name'] . '</option>';
}

<optgroup>これはすべて問題ありませんが、州/州全体から都市のかなり長いリストが返されるため、選択を少しわかりやすくするために、開始文字に基づいてカテゴリ別の「セクション」を動的に追加したいと考えています。結果はすでに名前でソートされているので、その部分は処理されます。

preg_grep()and を使用しpreg_match()て配列を小さな配列に分割し、それぞれの optgroup をエコーアウトしようとしましたが、うまくいきません...すべての都市が表示された後、 optgroup Bがリストの一番下に押し込まれます.

$citiesA = preg_grep('/^A.*/', $option);
$citiesB = preg_grep('/^B.*/', $option);

    echo '<optgroup label="A">';
    foreach($citiesA as $a) {
        echo '<option value="'. $a['city_id'] . '">' . $a['city_name'] . '</option>';
    }
    echo ' </optgroup>';

    echo '<optgroup label="B">';
    foreach($citiesB as $b) {
        echo '<option value="'. $b['city_id'] . '">' . $b['city_name'] . '</option>';
    }
    echo ' </optgroup>';

これを実現する方法についての提案は大歓迎です。

4

1 に答える 1

2

どうですか

$startl=""; // current Starting letter
foreach($option as $o)
{
    if (($c=substr($o['city_name'], 0, 1)) != $startl) // if starting letter changed
    {
        if ($startl) echo '</optgroup>';
        echo '<optgroup label="'. $c .'">'; // create new group
        $startl=$c;
    }
    echo '<option value="'. $o['city_id'] . '">' . $o['city_name'] . '</option>';
}
echo '</optgroup>'; // end the last group
于 2012-07-15T04:21:49.300 に答える