2010-06-16 97 views
1

我有一個在我的mysql抽象類中使用的函數(下面),並在「tableName.fieldName」字段中轉換表名,並用指定變量(它對連接有用)替換它們。字段數組是很複雜的,所以我需要它來支持遞歸,以便它可以更改表名在array(array(array("tableName.fieldName")))也爲標準array("tableName.fieldName","tableName.field2Name",...)PHP:遞歸保持變量的值?

然而,調試完畢後,我看到變量$i$fields_arr保持相同的值,即使我傳遞$fields_arr的新值,並且$i在循環開始時設置。我怎樣才能使這項工作,使$i$fields_arr採取我傳遞給他們的新價值?

/** 
    * @param mixed $fields_arr   standard array ("table.field1","table.field2",...) 
    * @param mixed $tables_and_vars eg. ("table1" => "tableVar1", "table2" => "tableVar2", ...) 
    * replaces all tablenames with desired tablevarnames 
    */ 
    private function tablesToTableVars($fields_arr, $tables_and_vars) { 
     // loop through every string 
     $numFields = count($fields_arr); 
     for($i = 0; $i < $numFields; $i++) { 
      $field = $fields_arr[$i]; 
      if(is_numeric($field)) continue; // don't replace numbers 
      if(is_array($field)) { 
       $fields_arr[$i] = $this->tablesToTableVars($field, $tables_and_vars); // *** RECURSION *** 
      } else { 
       $tableNameLen = strpos($field, "."); // pos of period in string 
       if(strpos($field, ".") === false) continue; // don't replace fields that dont have tablenames 

       $searchTableName = substr($field, 0, $tableNameLen); // take 'table' from 'table.field' 
       // see if field contains a table 
       foreach($tables_and_vars as $tableName => $tableVar) { 
        if($searchTableName === $tableName) { // if it is the table name we're looking for 
         $fields_arr[$i] = $tableVar . substr($field, $tableNameLen); // change it to the variable name 
         break; 
        } 
       } 
      } 
     } 
     return $fields_arr; 
    } 
+1

你怎麼知道$ numFields和$我保留價值?我看不到任何錯誤 – dbemerlin 2010-06-16 12:45:52

+0

我得到了'Undefined offset:0',但我只是意識到我的數組是聯想的,所以纔有意義。謝謝! haha – gsquare567 2010-06-16 12:52:49

+0

如果你已經知道了,請標記問題已經回答。謝謝, – David 2010-06-23 14:43:12

回答

0

不能使用整數索引的關聯數組=)

+0

是的,你可以......但是你不能使用'for'來循環關聯數組中的所有元素,所以你必須使用'foreach'。 – Piskvor 2010-06-23 15:15:58