2010-06-16 7 views
1

J'ai une fonction (ci-dessous) qui est utilisée dans ma classe d'abstraction mysql et convertit les noms de tables dans des champs comme "tableName.fieldName" et les remplace par les variables spécifiées (utile pour les jointures). le tableau des champs est très hétérogène, et donc je besoin pour soutenir récursivité afin qu'il puisse changer les noms de table dans un array(array(array("tableName.fieldName"))) mais aussi pour la norme array("tableName.fieldName","tableName.field2Name",...)PHP: la récursivité conserve les valeurs pour les variables?

cependant, après mise au point, je vois que les variables $i et $fields_arr maintiennent les mêmes valeurs, même si je transmets une nouvelle valeur pour $fields_arr et que $i est défini au début de la boucle. comment puis-je faire ce travail afin que $i et $fields_arr prendre les nouvelles valeurs que je passe pour eux?

/** 
    * @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

Comment savez-vous que $ numFields et je continue $ les valeurs? Je ne vois rien de mal – dbemerlin

+0

Je recevais 'Undefined offset: 0', mais je viens de réaliser que mon tableau est associatif, donc cela a du sens. Merci! haha – gsquare567

+0

Si vous l'avez compris, veuillez noter que la question a été répondue. Merci, – David

Répondre

0

ne peut pas utiliser les index entiers pour un tableau associatif =)

+0

Oui vous pouvez ... mais vous ne pouvez pas parcourir tous les éléments dans un tableau associatif en utilisant 'for', vous devez utiliser' foreach'. – Piskvor

Questions connexes