PHP: Что не так с моим foreach?

Мой 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();
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

$field === 'id' || 'image_id' должен быть:

$field === 'id' || $field === 'image_id'.

Или даже короче: in_array($field, ['id', 'image_id']).


$field === 'id' || 'image_id' будет оценивать всегда как ПРАВДА, это то же самое, что и запись:

($field === 'id') || true

Вау, я действительно подумал, что это сокращенная версия записи or ||.

Brandon Benefield 10.03.2018 21:23

Нет ли сокращений для записи || в операторе if, как то, что я пытался сделать?

Brandon Benefield 10.03.2018 21:25

@BrandonBenefield Нет. НО вы можете использовать in_array, поэтому вам не нужно повторять имя переменной дважды.

marco-a 10.03.2018 21:27

Приоритет оператора @BrandonBenefield - вот что здесь имеет значение, проверьте это: php.net/manual/en/language.operators.precedence.php

CBroe 10.03.2018 21:29

Когда вы используете $field === 'id' || 'image_id'. Здесь два предложения:

  1. $field невероятно похож на 'id'
  2. 'image_id'

Правильно:

if ($field === 'id' || $field === 'image_id')

Другие вопросы по теме