Мой foreach постоянно повторяет первое условие моего утверждения if, и для меня это не имеет никакого смысла.
Если вы заглянете внутрь foreach в первом фрагменте, вы увидите if, который проверяет, существует ли $field === id || image_id. Каждая итерация foreach выдает условие Im and ID: $field => $type <br>, даже если нет ни одного индекса с именем id или image_id. Что дает?
protected function create_db_table(string $table, array $fields) {
global $wpdb;
$table_name = $wpdb->prefix."$table";
$table_charset = $wpdb->get_charset_collate();
$field_names = [];
$check_id = array_key_exists('id', $fields) ? 'id' : 'image_id';
foreach ($fields as $field => $type) {
if ($field === 'id' || 'image_id') {
echo "Im an ID: $field => $type <br>";
$field_names[] = "$field $type UNSIGNED NOT NULL AUTO_INCREMENT";
} else {
echo "Im NOT and ID: $field => $type <br>";
$field_names[] = "$field $type";
}
}
$field_names = join(",\n", $field_names);
// echo "<h1>$field_names</h1>";
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
$field_names,
PRIMARY KEY ($check_id)
) $table_charset;";
require_once ABSPATH.'wp-admin/includes/upgrade.php';
dbDelta($sql);
}
function activation_methods() {
$slider_settings = new SliderSettings;
$slider_settings_fields = [
'id' => 'int(9)',
'transition_time' => 'int(9)',
'loop_carousel' => 'tinytext',
'stop_on_hover' => 'tinytext',
'reverse_order' => 'tinytext',
'navigation_arrows' => 'tinytext',
'show_pagination' => 'tinytext'
];
$slider_images = new SliderImages;
$slider_images_fields = [
'image_id' => 'int(9)',
'carousel_id' => 'int(9)',
'image_url' => 'text'
];
$slider_settings->create_db('bb_slidersettings', $slider_settings_fields);
$slider_images->create_db('bb_sliderimages', $slider_images_fields);
}
activation_methods();






$field === 'id' || 'image_id' должен быть:
$field === 'id' || $field === 'image_id'.
Или даже короче: in_array($field, ['id', 'image_id']).
$field === 'id' || 'image_id' будет оценивать всегда как ПРАВДА, это то же самое, что и запись:
($field === 'id') || true
Нет ли сокращений для записи || в операторе if, как то, что я пытался сделать?
@BrandonBenefield Нет. НО вы можете использовать in_array, поэтому вам не нужно повторять имя переменной дважды.
Приоритет оператора @BrandonBenefield - вот что здесь имеет значение, проверьте это: php.net/manual/en/language.operators.precedence.php
Когда вы используете $field === 'id' || 'image_id'.
Здесь два предложения:
$field невероятно похож на 'id''image_id'Правильно:
if ($field === 'id' || $field === 'image_id')
Вау, я действительно подумал, что это сокращенная версия записи
or ||.