Imprimer le tableau dans un fichier

186

Je voudrais imprimer un tableau dans un fichier.

Je voudrais que le fichier ressemble exactement à ce à quoi ressemble un code comme celui-ci.

print_r ($abc); en supposant que $ abc est un tableau.

Y a-t-il une solution pour cela plutôt que régulière pour chaque look.

PS - J'utilise actuellement sérialiser mais je veux rendre les fichiers lisibles car la lisibilité est assez difficile avec les tableaux sérialisés.

Atif Mohammed Ameenuddin
la source

Réponses:

319

Soit var_exportou défini print_rpour renvoyer la sortie au lieu de l'imprimer.

Exemple du manuel PHP

$b = array (
    'm' => 'monkey', 
    'foo' => 'bar', 
    'x' => array ('x', 'y', 'z'));

$results = print_r($b, true); // $results now contains output from print_r

Vous pouvez ensuite enregistrer $resultsavec file_put_contents. Ou renvoyez-le directement lors de l'écriture dans le fichier:

file_put_contents('filename.txt', print_r($b, true));
Gordon
la source
Comment pouvez-vous enregistrer UNIQUEMENT le contenu du tableau et non le tableau entier "[0] => blah" ??
user1899415
14
@ user1899415 implodele tableau avec PHP_EOLet écrivez la chaîne résultante dans le fichier.
Gordon
14
var_exportest préférable si vous souhaitez enregistrer le fichier dans la syntaxe php. print_rrevient [m] => monkeymais var_exportrevient'm' => 'monkey'
Pedram Behroozi
1
@Wold oui, vérifiez l'option $ flags dans file_put_contents.
Gordon
5
@Wold utilise FILE_APPEND pour cet exemple: file_put_contents ('filename.txt', print_r ($ b, true), FILE_APPEND); il les ajoutera à la fin du fichier sans les écraser à chaque fois. De plus, vous pouvez le changer en: print_r ($ b, true). "\ n" pour ajouter un saut de ligne supplémentaire ou une nouvelle ligne.
Tarik
53

Utilisez simplement print_r; ) Lisez la documentation :

Si vous souhaitez capturer la sortie de print_r(), utilisez le returnparamètre. Lorsque ce paramètre est défini sur TRUE, print_r() renvoie les informations plutôt que de les imprimer.

Voici donc une possibilité:

$fp = fopen('file.txt', 'w');
fwrite($fp, print_r($array, TRUE));
fclose($fp);
Félix Kling
la source
26

file_put_contents($file, print_r($array, true), FILE_APPEND)

binaryLV
la source
25

Tu pourrais essayer:

$h = fopen('filename.txt', 'r+');
fwrite($h, var_export($your_array, true));
Sarfraz
la source
Ajoutez le deuxième trueparamètre de à var_export, sinon il n'y a pas de contenu à écrire dans le fichier.
Progrock
var_export était une meilleure solution dans mon expérience car il entoure la variable de tableau entre guillemets, donc gère mieux lorsque vous utilisez include / require pour accéder aux valeurs du tableau
Pete - iCalculator
9

Faites ceci rapidement et simplement:

file_put_contents($filename, var_export($myArray, true));
Alexwenzel
la source
4

Vous pouvez essayer ceci, $myArraycar le tableau

$filename = "mylog.txt";
$text = "";
foreach($myArray as $key => $value)
{
    $text .= $key." : ".$value."\n";
}
$fh = fopen($filename, "w") or die("Could not open log file.");
fwrite($fh, $text) or die("Could not write file!");
fclose($fh);
Ahmad
la source
4

Je viens d'écrire cette fonction pour générer un tableau sous forme de texte:

Devrait produire un tableau bien formaté.

NOTE IMPORTANTE:

Méfiez-vous des entrées de l'utilisateur.

Ce script a été créé pour un usage interne.

Si vous avez l'intention de l'utiliser pour un usage public, vous devrez ajouter une validation de données supplémentaire pour empêcher l'injection de script.

Ce n'est pas infaillible et ne doit être utilisé qu'avec des données fiables.

La fonction suivante affichera quelque chose comme:

$var = array(
  'primarykey' => array(
    'test' => array(
      'var' => array(
        1 => 99,
        2 => 500,
      ),
    ),
    'abc' => 'd',
  ),
);

voici la fonction (note: la fonction est actuellement formatée pour l'implémentation oop.)

  public function outArray($array, $lvl=0){
    $sub = $lvl+1;
    $return = "";
    if($lvl==null){
      $return = "\t\$var = array(\n";  
    }
      foreach($array as $key => $mixed){
        $key = trim($key);
        if(!is_array($mixed)){
          $mixed = trim($mixed);
        }
        if(empty($key) && empty($mixed)){continue;}
        if(!is_numeric($key) && !empty($key)){
          if($key == "[]"){
            $key = null;
          } else {
            $key = "'".addslashes($key)."'";
          }
        }

        if($mixed === null){
          $mixed = 'null';
        } elseif($mixed === false){
          $mixed = 'false';
        } elseif($mixed === true){
          $mixed = 'true';
        } elseif($mixed === ""){
          $mixed = "''";
        } 

        //CONVERT STRINGS 'true', 'false' and 'null' TO true, false and null
        //uncomment if needed
        //elseif(!is_numeric($mixed) && !is_array($mixed) && !empty($mixed)){
        //  if($mixed != 'false' && $mixed != 'true' && $mixed != 'null'){
        //    $mixed = "'".addslashes($mixed)."'";
        //  }
        //}


        if(is_array($mixed)){
          if($key !== null){
            $return .= "\t".str_repeat("\t", $sub)."$key => array(\n";
            $return .= $this->outArray($mixed, $sub);
            $return .= "\t".str_repeat("\t", $sub)."),\n";
          } else {
            $return .= "\t".str_repeat("\t", $sub)."array(\n";
            $return .= $this->outArray($mixed, $sub);
            $return .= "\t".str_repeat("\t", $sub)."),\n";            
          }
        } else {
          if($key !== null){
            $return .= "\t".str_repeat("\t", $sub)."$key => $mixed,\n";
          } else {
            $return .= "\t".str_repeat("\t", $sub).$mixed.",\n";
          }
        }
    }
    if($lvl==null){
      $return .= "\t);\n";
    }
    return $return;
  }

Alternativement, vous pouvez utiliser ce script que j'ai également écrit il y a quelque temps:

Celui-ci est agréable pour copier et coller des parties d'un tableau.

(Ce serait presque impossible de le faire avec une sortie sérialisée)

Pas la fonction la plus propre mais elle fait le travail.

Celui-ci sortira comme suit:

$array['key']['key2'] = 'value';
$array['key']['key3'] = 'value2';
$array['x'] = 7;
$array['y']['z'] = 'abc';

Faites également attention à la saisie de l'utilisateur. Voici le code.

public static function prArray($array, $path=false, $top=true) {
    $data = "";
    $delimiter = "~~|~~";
    $p = null;
    if(is_array($array)){
      foreach($array as $key => $a){
        if(!is_array($a) || empty($a)){
          if(is_array($a)){
            $data .= $path."['{$key}'] = array();".$delimiter;
          } else {
            $data .= $path."['{$key}'] = \"".htmlentities(addslashes($a))."\";".$delimiter;
          }
        } else {
          $data .= self::prArray($a, $path."['{$key}']", false);
        }    
      }
    }
    if($top){
      $return = "";
      foreach(explode($delimiter, $data) as $value){
        if(!empty($value)){
          $return .= '$array'.$value."<br>";
        }
      };
      echo $return;
    }
    return $data;
  }
Dieter Gribnitz
la source
1
Autant que je sache, print_r ne produit pas les données dans un format qui peut être copié et collé en tant que code php de travail. Cela formatera la sortie d'une manière qui peut être copiée et collée comme un tableau de travail.
Dieter Gribnitz
2

il suffit d'utiliser file_put_contents('file',$myarray); file_put_contents () fonctionne aussi avec les tableaux.

Patrick Mutwiri
la source
2
Cela devrait vraiment être la réponse acceptée à mon avis, bien qu'il soit intéressant de noter que file_put_contents ne peut fonctionner qu'avec un seul tableau pour son deuxième argument.
user3610279
1

Voici ce que j'ai appris au cours des 17 dernières heures qui a résolu mon problème en cherchant une solution similaire.

Ressources:

http://php.net/manual/en/language.types.array.php

Code spécifique:

// The following is okay, as it's inside a string. Constants are not looked for
// within strings, so no E_NOTICE occurs here
print "Hello $arr[fruit]";      // Hello apple

Ce que j'ai pris d'en haut, $ arr [fruit] peut entrer dans "" (guillemets doubles) et être accepté comme chaîne par PHP pour un traitement ultérieur.

La deuxième ressource est le code dans l'une des réponses ci-dessus:

file_put_contents($file, print_r($array, true), FILE_APPEND)

C'est la deuxième chose que je ne savais pas, FILE_APPEND.

Ce que j'essayais de réaliser, c'est d'obtenir le contenu d'un fichier, de modifier les données souhaitées et de mettre à jour le fichier avec de nouvelles données, mais après avoir supprimé les anciennes données.

Maintenant, j'ai seulement besoin de savoir comment supprimer les données du fichier avant d'ajouter des données mises à jour.

À propos des autres solutions:

Juste pour que cela puisse être utile à d'autres personnes; quand j'ai essayé var_export ou Print_r ou Serialize ou Json.Encode , j'ai soit des caractères spéciaux comme => ou; ou 'ou [] dans le fichier ou une sorte d'erreur. J'ai essayé trop de choses pour se souvenir de toutes les erreurs. Donc, si quelqu'un peut vouloir les essayer à nouveau (peut avoir un scénario différent du mien), il peut s'attendre à des erreurs.

À propos de la lecture du fichier, de l'édition et de la mise à jour:

J'ai utilisé la fonction fgets () pour charger le tableau de fichiers dans une variable ($ array) puis utiliser unset ($ array [x]) (où x représente le numéro de tableau souhaité, 1,2,3 etc.) pour supprimer un tableau particulier. Ensuite, utilisez array_values ​​() pour réindexer et charger le tableau dans une autre variable, puis utilisez une boucle while et les solutions ci-dessus pour vider le tableau (sans aucun caractère spécial) dans le fichier cible.

$x=0;

while ($x <= $lines-1) //$lines is count($array) i.e. number of lines in array $array
    {
        $txt= "$array[$x]";
        file_put_contents("file.txt", $txt, FILE_APPEND);
        $x++;
    }
Sumit
la source
1

Cependant, op doit écrire un tableau tel qu'il est sur fichier.J'ai débarqué sur cette page pour trouver une solution où je peux écrire un tableau dans un fichier et que je peux facilement le lire plus tard en utilisant à nouveau php.

J'ai trouvé une solution moi-même en utilisant json_encode afin que tout le monde cherche la même chose, voici le code:

file_put_contents('array.tmp', json_encode($array));

que de lire

$array = file_get_contents('array.tmp');
$array = json_decode($array,true);
dessins de vividus
la source
0

Ci-dessous devrait fonctionner correctement et plus lisible <pre>

<?php 

ob_start();
echo '<pre>';
print_r($array);
$outputBuffer = ob_get_contents();
ob_end_flush();
file_put_contents('your file name', $outputBuffer);
?>
kamal copain
la source
0

test.php

<?php  
return [
   'my_key_1'=>'1111111',
   'my_key_2'=>'2222222',
];

index.php

// Read array from file
$my_arr = include './test.php';

$my_arr["my_key_1"] = "3333333";

echo write_arr_to_file($my_arr, "./test.php");

/**
* @param array $arr <p>array</p>
* @param string $path <p>path to file</p>
* example :: "./test.php"
* @return bool <b>FALSE</b> occurred error
* more info: about "file_put_contents" https://www.php.net/manual/ru/function.file-put-contents.php
**/
function write_arr_to_file($arr, $path){
    $data = "\n";
    foreach ($arr as $key => $value) {
        $data = $data."   '".$key."'=>'".$value."',\n";
    }
    return file_put_contents($path, "<?php  \nreturn [".$data."];");
}
Юрий Светлов
la source