2009-10-27 5 views
0

Mon but ici est d'ouvrir temp.php, exploser par ### (terminateur de ligne), puis par %% (terminateur de champ). Changez un champ spécifique, sur une ligne spécifique, puis implosez tout ensemble et enregistrez-le.ouvrir le fichier avec des données csv brutes, exploser tableau et sous-tableau, modifier la ligne, et le pack sauvegarder et enregistrer, en PHP

Il y a des variables couple en jeu ici:

row = le numéro de ligne cible
target = le nombre champ cible/colonne
nfv = l'info que je veux placer dans le champ cible

Im en utilisant le compteur $i pour compter jusqu'à ce que j'arrive à la rangée désirée. Puis contrer $j pour compter jusqu'à ce que j'arrive à mon champ/cible désiré. Jusqu'à présent, cela me donne une erreur pour les arguments implosés invalides, ou n'enregistre aucune donnée du tout. Je suis sûr qu'il y a quelques choses qui ne vont pas, mais je suis frustré et perdu.

<? 
$row = $_GET['row']; 
$nfv = $_GET['nfv']; 
$target = $_GET['target']; 
$data = file_get_contents("temp.php"); 
$csvpre = explode("###", $data); 
$i = 0; 
$j = 0; 
    foreach ($csvpre AS $key => $value){ 
     $i++; 
     if($i == $row){ 
      $info = explode("%%", $value); 
       foreach ($info as $key => $value){ 
        $j++; 
         if($j == "$target"){ 
          $value = $nfv; 
         } 
       } 
      $csvpre[$key] = implode("%%", $info); 
     }   
    } 


$save = implode("###", $csvpre); 
$fh = fopen("temp.php", 'w') or die("can't open file"); 
fwrite($fh, $save); 
fclose($fh); 
header("Location: data.php"); 
?> 

Si quelqu'un peut dire ce qui est mal à cela, s'il vous plaît être détaillé pour que je puisse apprendre pourquoi sa ne fonctionne pas.

Voici quelques données csv exemple pour les tests

1%%4%%Team%%40%%75###2%%4%%Individual%%15%%35###3%%4%%Stunt Group%%50%%150###4%%4%%Coed Partner Stunt%%50%%150###5%%4%%Mascot%%15%%35###6%%8%%Team%%40%%75###7%%8%%Stunt Group%%50%%150###8%%8%%Coed Partner Stunt%%50%%150###9%%3%%Team%%40%%75###10%%1%%Team%%40%%75###11%%1%%Solo%%15%%35###12%%1%%Duet%%50%%150###13%%2%%Team%%50%%50###14%%2%%Solo%%15%%35###15%%2%%Duet%%50%%150###16%%8%%Individual%%15%%35### 
+0

Vous n'avez pas déjà posé cette question? http://stackoverflow.com/questions/1629230/invalid-argument-when-imploding-in-php – cletus

+2

Je ne peux pas m'empêcher de me demander ... Si vous savez que les valeurs auront le délimiteur %%, pourquoi ne pas simplement faire un simple 'str_replace (" %% $ cible %% "," %% $ nfv %% , $ file_as_string) '? – Anthony

+0

@anthony, $ cible est le numéro de champ, pas la valeur dans le champ. –

Répondre

1

Ce qui suit devrait fonctionner. Cela élimine aussi beaucoup de looping inutiles

<?php 
$row = $_GET['row']; 
$nfv = $_GET['nfv']; 
$target = $_GET['target']; 
$data = file_get_contents("temp.php"); 
$csvpre = explode("###", $data); 

//removed i and j. unnecessary. 

//checks if the row exists. simple precaution 
if (isset($csvpre[$row])) 
{ 
    //temporary variable, $target_row. just for readability. 
    $target_row = $csvpre[$row]; 

    $info = explode("%%", $target_row); 

    //check if the target field exists. just another precaution. 
    if (isset($info[$target])) 
    { 
    $info[$target] = $nfv; 
    } 
    //same as yours. just pack it back together. 
    $csvpre[$row] = implode("%%", $info); 
} 


$save = implode("###", $csvpre); 
$fh = fopen("temp.php", 'w') or die("can't open file"); 
fwrite($fh, $save); 
fclose($fh); 
header("Location: data.php"); 
?> 

La boucle que vous faisiez a été enlevé comme la ligne ont été indexés numériquement déjà de toute façon. Accéder directement à l'élément de tableau est beaucoup plus rapide que de boucler les éléments jusqu'à ce que vous trouviez ce que vous voulez.

+0

pendant que je essayez cela, pourriez-vous élaborer un peu sur ce que vous avez fait et pourquoi? Merci d'avoir pris le temps .. – mrpatg

+0

J'ai essayé ceci, ce qui se passe est dis je sélécis la ligne 1 et ma cible.C'est en cours d'exécution, mais sa création d'une ligne vide et ne pas mettre à jour la ligne/cible spécifiée Apparemment c'est mettre six # dans une rangée.Mais je ne vois pas non plus mes informations mises à jour partout (valeur de nfv) – mrpatg

+0

J'ai eu une erreur à '$ info = exploser ("% % ", $ value);' Je l'ai corrigé dans l'édition. S'il vous plaît assurez-vous que yours dit '$ info = explode (" %% ", $ targ et_row); ' –

Questions connexes