формы — Проверка, что переключатель по умолчанию, если ни один не отмечен, переполнение стека

Я пытаюсь установить радио-кнопку по умолчанию, если ни одна из них уже не отмечена.

$ p [‘selected’] сообщает, был ли он выбран ранее. Я почти там с кодом ниже, но он всегда устанавливает первую строку, как проверено. Я только хочу, чтобы это произошло, если ни один не проверен. Так что в основном я хочу посмотреть, если какие-либо проверены, а если нет, то установить по умолчанию. Использовал php 5.2.

<?php
$i = 0;
foreach($options as $p):
if($p['selected']) {
$checked = "checked";
} elseif ($i == 0) {
$checked = "checked";
} else {
$checked = '';
}
?>
<div class="radio">
<label>
<input type="radio" name="option" <? echo $checked;?> value="<?=$p['id'];?>" onclick="document.forms.basket.submit();"><?=$p['name'];?>
</label>
</div>
<?php
$i++;
endforeach;
?>

1

Решение

Вы должны сделать «предварительную проверку» $options чтобы определить, установлены ли они. Иначе, $i == 0 всегда будет происходить в вашем цикле, независимо от того, был выбран один из параметров или нет.

// Filters all elements of `$options`, and only returns those that have `selected` set and truthy
$has_checked = array_filter( $options, function( $p ) {
return ( ! empty( $p['selected'] ) );
});

// Sets to boolean - true if any of the $options were checked, false otherwise
$has_checked = ( ! is_empty( $has_checked ) );

Тогда в вашем цикле:

$i = 0;
foreach($options as $p):
// move this here to simplify the if statement
$checked = '';

if($p['selected']) {
$checked = 'checked';
// only set in this case if $has_checked is false
} elseif ( ! $hash_checked && 0 === $i++ ) {
$checked = 'checked';
}
....

Который мог при желании можно сложить так:

    if($p['selected'] || ( ! $hash_checked && 0 === $i++ ) ) {
$checked = 'checked';
}

И вы можете удалить $i++ с конца вашего цикла while.

ОБНОВЛЕНИЕ для очень старых версий PHP (старше 5.3)
OP использует PHP 5.2, который не поддерживает анонимные функции (стал доступен в 5.3). Ниже представлен обходной путь:

// Filters all elements of `$options`, and only returns those that have `selected` set and truthy
$has_checked = array_filter( $options, 'has_checked' );

function has_checked( $p ) {
return ( ! empty( $p['selected'] ) );
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector