PHP группировка опций в optgroup - PullRequest
0 голосов
/ 21 марта 2020

Я работаю на сайте woocommerce, и мне нужно найти способ сгруппировать опции выбора в optgroups.

Моя опция хранится в виде массива, например

aray = [  
            "A4 1.9tdi (2003-2009)",  
            "A4 2.0tdi (2003-2009)",  
            "Passat B7 1.9tdi(2003-2009)",  
            "Passat B7 2.0 tdi(2003-2010)"  
        ]  

Нет, что мне нужно должен сделать php выбор, который сгруппировал бы опции в optgroup, используя строку до первого пробела

Используя функцию

explode(' ',$s, 2) or by strpos($inputString, ' ');

, я могу разделить значения по мере необходимости .

Мне нужно адаптировать код, который я сейчас использую для отображения опций:

$html = '<span class="number">' . ($level + 1).'</span><select class="'.$class.'" name="'.$levelData['url_parameter'].'" '.$extra.'>;
    foreach ( $this->getLevelOptions($level) as $val ){
      $html .= '<option value="'.esc_attr( $val ).'" '.($val == $value ? 'selected' : '').'>'.esc_html( $val ).'</option>';         
    }
    $html .= '</select>';

    return $html;    

Чтобы я мог показать опции, сгруппированные по optgroup, например:

A4 (optgroup)
A4 1.9tdi (2003-2009)  
A4 2.0tdi (2003-2009) 
Passat (optgroup)
Passat B7 1.9tdi(2003-2009)  
Passat B7 2.0 tdi(2003-2010)

Буду признателен, если кто-нибудь сможет мне помочь.

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Я не уверен, что понимаю вашу html часть. (По крайней мере, на мобильном очень трудно читать)
Но это, вероятно, будет делать то, что вы хотите, просто замените метки-заполнители html.

Сначала я создаю новый массив, который ассоциативно связан с первым word (модель автомобиля).
Это также гарантирует, что оно будет отсортировано, когда я начну выводить.

Затем я просто вывожу ключ и взорву все значения в подмассиве.

$array = [  
            "A4 1.9tdi (2003-2009)",  
            "A4 2.0tdi (2003-2009)",  
            "Passat B7 1.9tdi(2003-2009)",  
            "Passat B7 2.0 tdi(2003-2010)"  
        ];

foreach($array as $val){
    $temp = explode(" ", $val);
    $new[$temp[0]][] = $val;
}

foreach($new as $car => $cars){
    echo "<some html tag>". $car . "</Some html tag>\n";
    echo "<some other tag>" . implode("</some other tag>\n<some other tag>", $cars) . "</some other tag>\n";
    echo "\n";
}

Выходы:

<some html tag>A4</Some html tag>
<some other tag>A4 1.9tdi (2003-2009)</some other tag>
<some other tag>A4 2.0tdi (2003-2009)</some other tag>

<some html tag>Passat</Some html tag>
<some other tag>Passat B7 1.9tdi(2003-2009)</some other tag>
<some other tag>Passat B7 2.0 tdi(2003-2010)</some other tag>

https://3v4l.org/N8YTu

0 голосов
/ 21 марта 2020

Это форматирует группу параметров, помещая значения в атрибуте value внутри каждого параметра. <option value="1.9tdi (2003-2009)"> и оборачивает все это в тег выбора.

$cars = array(
    "A4 1.9tdi (2003-2009)",  
    "A4 2.0tdi (2003-2009)",  
    "Passat B7 1.9tdi(2003-2009)",  
    "Passat B7 2.0 tdi(2003-2010)"
);

foreach($cars as $car){
    $model = explode(' ', $car, 2);
    $make[$model[0]][] = $car;  
}

$stmt = 'Select a car: <select id="cars">';
foreach($make as $label => $type){
    $stmt .= '<optgroup label="'.$label.'">';

    foreach($type as $car){
        list($mk, $cr) = explode(' ', $car, 2);
        $stmt .= '<option value="'.$cr.'">'.$cr.'</option>';
    }
    $stmt .= '</optgroup>';
}

$stmt .= '</select>';

В html отобразите переменную $ stmt.

<?=$stmt?>

https://3v4l.org/bb2nR

...