Я пытаюсь установить радио-кнопку по умолчанию, если ни одна из них уже не отмечена.
$ 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;
?>
Вы должны сделать «предварительную проверку» $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'] ) );
}
Других решений пока нет …