【问题标题】:PHP: What's wrong with my foreach?PHP:我的 foreach 有什么问题?
【发布时间】:2018-08-19 04:43:03
【问题描述】:

我的foreach 不断地回显我的if 语句的第一个条件,这对我来说没有任何意义。

如果您在第一个 sn-p 中查看 foreach 内部,您会看到一个 if 来检查 $field === id || image_id 是否存在。即使没有称为idimage_id 的单个索引,foreach 的每次迭代都会输出Im and ID: $field => $type <br> 条件。什么给了?

这是整个方法

  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 loops if-statement foreach conditional


    【解决方案1】:

    $field === 'id' || 'image_id' 应该是:

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

    甚至更短:in_array($field, ['id', 'image_id'])


    $field === 'id' || 'image_id'总是评估为 TRUE,这与写作相同:

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

    【讨论】:

    • 哇,我真的以为这是写 or || 的简写版本。
    • if 语句中写|| 是否没有速记,就像我尝试的那样?
    • @BrandonBenefield 没有。但是您可以使用in_array,这样您就不必重复变量名两次。
    • @BrandonBenefield 运算符优先级在这里起作用,请查看:php.net/manual/en/language.operators.precedence.php
    【解决方案2】:

    当您使用 $field === 'id' || 'image_id' 时。 这里有两句话:

    1. $field 等于 'id'
    2. 'image_id'

    正确的是:

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

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      相关资源
      最近更新 更多