2013-08-27 30 views
-1

所以我有嵌套的foreach循環,我想知道是否有一種更有效的方式來做到這一點,代碼明智:嵌套的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); 
} 

基本上,我想,以優化或者速度,然後少寫代碼 - 按順序或最優化兩者。

+0

老兄,你剛剛刪除了代碼,並放置了一個完全不同的代碼 - 不是很酷! – alfasin

+0

而不是,因爲嵌套的'foreach'循環的參數之間沒有連接 - 它不能被優化。 – alfasin

+0

我不知道這是一個失禮。我抓住了錯誤的代碼塊。 –

回答

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(); 
    } 
} 

OR

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()要求這些值位於關聯數組中,列名稱爲鍵。

這是乾淨的?