Выпадающий список select не отображает выбранное значение в PHP
Я использую WordPress Settings API
. Всё работает как надо, кроме этого select
dropdown. Когда я выбираю опцию, значение выводится правильно, но в выпадающем списке отображается первое значение по умолчанию (т.е. 6
), а не выбранное. В чём моя ошибка?
public function someplugin_select() {
$options = get_option('plugin_252calc');
echo $options; //показывает корректное выбранное значение
$items = array();
for ($i=6; $i <=10; $i+= 0.1)
{
$items[] = $i;
}
echo '<select id="cf-nb" name="cf-nb">';
foreach ($items as $item)
{
echo '<option value="'. $item .'"';
if ($item == $options) echo ' selected="selected"';
echo '>'. $item .'</option>';
}
echo '</select>';
}

Причина, по которой ваше условие $item == $option
всегда возвращает false, кроется в особенностях сравнения чисел с плавающей запятой в PHP!
Попробуйте следующий вариант:
echo "<option value='$item'" . selected (abs ($item - $options) <= 0.01, true, false) . ">$item</option>" ;
Подробнее читайте в статье Сравнение чисел с плавающей запятой.

для тех, кому интересно: проблема не в PHP как таковом, а в бинарном представлении чисел с плавающей точкой. почитайте Comparing Floating Point Numbers, 2012 Edition для хорошего объяснения, почему метод с эпсилон, упомянутый выше, не идеален во всех случаях (хотя для автора вопроса его точно хватит).

Я разобрался с этим и могу сказать, что в WordPress есть функция selected
, которую вы можете увидеть по этой ссылке. Используйте эту функцию вместо конструкции if ( $item == $options )
. Ваш код может выглядеть так:
foreach ( $seconds as $second => $time ) {
?>
<option value="<?php echo $second; ?>" <?php selected( $browser_cache_ttl, $second ); ?>><?php echo $time; ?></option>
<?php
}
Эта функция проходит через массив $seconds
, получает $second
и $time
, устанавливает $second
в качестве значения, затем вызывает функцию selected
, где первый параметр — это значение для сравнения, а второй — текущее значение. Если эти значения совпадают, элемент будет выбран.
Думаю, это то, что вам нужно. Сообщите, если это сработало.

Замените ваш select на этот... Надеюсь, он сработает...
echo '<select id="cf-nb" name="cf-nb">';
foreach ( $items as $item ){
$if_selected = $item == $options ? "selected='selected'" : "";
echo "<option value='{$item}' {$if_selected}>$item</option>";
}
echo '</select>';

У меня нет лучших ответов, но я чувствую, что у меня достаточно похожая проблема, чтобы добавить её к этому вопросу вместо создания нового.
Я начал с https://www.youtube.com/watch?v=hbJiwm5YL5Q&t=3969s и дошел до 1:05:00, и моя текущая версия выглядит так:
function selectpageHTML() {?>
<select name="lp_actPage">
<?
$pages = get_pages(); foreach ( $pages as $page ) {
$title = $page->post_title;
echo "<option value='$title'" . selected(get_option('lp_actPage', $title)) .">$title</option>";
} ?>
</select>
<?}
Однако вместо сравнения чисел с плавающей точкой я подумал, что мог бы сравнивать строковые значения, но пока безрезультатно.
Я также пробовал присваивать переменной ID страницы и использовать эту переменную как значение option, а также как второй аргумент в функции get_option(), но всё равно без успеха.

Это не совсем отвечает на вопрос. Если у вас другой вопрос, вы можете задать его, нажав Задать вопрос. Чтобы получать уведомления о новых ответах на этот вопрос, вы можете отслеживать этот вопрос. Как только у вас будет достаточно репутации, вы также сможете установить награду, чтобы привлечь больше внимания к этому вопросу. - Из обзора
