-1

所以我有嵌套的 foreach 循环,我想知道是否有更有效的方法来做到这一点,代码方面:

foreach ($arraykey as $columnname => $value) {
    foreach ($records as $field_entity_id) {    
        $fieldinsertloop = "('registration', 'reg_type', 0,".$field_entity_id.",".$field_entity_id.", 'und', 0,'".$value."','".$value."')";
    }
    $sql = "INSERT INTO " .str_replace("multi_reg", "field_data", $columnname);
    $sql .= " (entity_type, bundle, deleted, revision_id, entity_id, language, delta, ".str_replace("multi_reg_", "", $columnname)."_value, ".str_replace("multi_reg_", "", $columnname)."_format)";
    $sql .= " VALUES ";
    $sql .= $fieldinsertloop;
    db_query($sql);
}

基本上,我想优化速度,然后减少编写的代码 - 以该顺序或同时优化两者。

4

1 回答 1

1

您可以通过使用引用值从循环中获得更多性能:

foreach ($arraykey as $columnname => &$value) {

因此&$value,但要注意,每次你做某事$value之后,它都会影响原始$arraykey[$columnname]值。此外,不确定您是否正确嵌套了 foreach。我会将嵌套 foreach 的结束括号向下移动:

// $value passed by reference
foreach ($arraykey as $columnname => &$value) {

    // Pass $field_entity_id by reference
    foreach ($records as &$field_entity_id) {

        $fieldinsertloop = "('registration', 'reg_type', 0,".$field_entity_id.",".$field_entity_id.", 'und', 0,'".$value."','".$value."')";

        $sql = "INSERT INTO " .str_replace("multi_reg", "field_data", $columnname);
        $sql .= " (entity_type, bundle, deleted, revision_id, entity_id, language, delta, ".str_replace("multi_reg_", "", $columnname)."_value, ".str_replace("multi_reg_", "", $columnname)."_format)";
        $sql .= " VALUES ";
        $sql .= $fieldinsertloop;

        db_query($sql);

    } // End of nested foreach moved here
}



您的代码的另一个问题,您似乎正在使用 Drupal db_query(),它具有更好的插入值的方法。如果是,您可以将代码更改为:

foreach ($arraykey as $columnname => &$value) {

    $table = str_replace("multi_reg", "field_data", $columnname);
    $columns = array('entity_type', 'bundle', 'deleted', 'revision_id', 'entity_id', 'language', 'delta', str_replace("multi_reg_", "", $columnname).'_value', str_replace("multi_reg_", "", $columnname).'_format');

    foreach ($records as &$field_entity_id) {

        $values = array('registration', 'reg_type', 0, $field_entity_id, $field_entity_id, 'und', 0, $value, $value);

        //Build Associative Array for Insert
        for( $x = 0, $max = count($values); $x < $max; $x++ ) {
            $sqlValues[$columns[$x]] = $values[$x];
        }

        db_insert($table)->fields($columns)->values($sqlValues)->execute();
    }
}

或者

foreach ($arraykey as $columnname => &$value) {

    $table = str_replace("multi_reg", "field_data", $columnname);
    $columns = array('entity_type', 'bundle', 'deleted', 'revision_id', 'entity_id', 'language', 'delta', str_replace("multi_reg_", "", $columnname).'_value', str_replace("multi_reg_", "", $columnname).'_format');
    $query = db_insert($table)->fields($columns);

    foreach ($records as &$field_entity_id) {

        $values = array('registration', 'reg_type', 0, $field_entity_id, $field_entity_id, 'und', 0, $value, $value);

        //Build Associative Array for Insert
        for( $x = 0, $max = count($values); $x < $max; $x++ ) {
            $sqlValues[$columns[$x]] = $values[$x];
        }

        $query->values($sqlValues);
    }
    $query->execute();
}

第二个示例应该更快,但行数更多。它会等到所有值都添加完毕后再执行。使用db_insert()要求值位于关联数组中,列名作为键。

怎么样才算干净?

于 2013-08-27T18:16:44.707 回答