Распечатать массив в файл - PullRequest
164 голосов
/ 13 апреля 2010

Я хотел бы напечатать массив в файл.

Мне бы хотелось, чтобы файл выглядел точно так же, как выглядит этот код.

print_r ($abc); при условии, что $ abc является массивом.

Есть ли одно-строчное решение для этого, а не обычное для каждого вида.

P.S. В настоящее время я использую сериализацию, но я хочу сделать файлы читаемыми, поскольку с сериализованными массивами читаемость довольно трудна

Ответы [ 11 ]

272 голосов
/ 13 апреля 2010

Либо var_export, либо установите print_r, чтобы вернуть вывод вместо его печати.

Пример из руководства по PHP

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

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

Затем вы можете сохранить $results с помощью file_put_contents. Или верните его напрямую при записи в файл:

file_put_contents('filename.txt', print_r($b, true));
51 голосов
/ 13 апреля 2010

Просто используйте print_r; ) Прочитайте документацию :

Если вы хотите захватить вывод print_r(), используйте параметр return. Если для этого параметра установлено значение TRUE, print_r() будет возвращать информацию, а не печатать ее.

Так что это одна из возможностей:

$fp = fopen('file.txt', 'w');
fwrite($fp, print_r($array, TRUE));
fclose($fp);
25 голосов
/ 13 апреля 2010

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

22 голосов
/ 13 апреля 2010

Вы можете попробовать:

$h = fopen('filename.txt', 'r+');
fwrite($h, var_export($your_array, true));
6 голосов
/ 04 июня 2015

Быстро и просто сделайте это:

file_put_contents($filename, var_export($myArray, true));
4 голосов
/ 15 апреля 2013

Я только что написал эту функцию для вывода массива в виде текста:

Должен вывести красиво отформатированный массив.

ВАЖНОЕ ПРИМЕЧАНИЕ:

Остерегайтесь пользовательского ввода.

Этот скрипт был создан для внутреннего использования.

Если вы намереваетесь использовать это для публичного использования, вам потребуется добавить дополнительную проверку данных, чтобы предотвратить внедрение скрипта.

Это не защищено от ошибок и должно использоваться только с надежными данными.

Следующая функция выведет что-то вроде:

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

вот функция (примечание: функция в настоящее время отформатирована для реализации 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;
  }

Вы также можете использовать этот скрипт, который я тоже недавно написал:

Это хорошо для копирования и вставки частей массива.

(было бы почти невозможно сделать это с сериализованным выходом)

Не самая чистая функция, но она выполняет свою работу.

Этот выводит следующее:

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

Также позаботьтесь о пользовательском вводе. Вот код.

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;
  }
4 голосов
/ 05 октября 2012

Вы можете попробовать это, $myArray как массив

$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);
1 голос
/ 03 марта 2016

просто используйте file_put_contents('file',$myarray); file_put_contents () также работает с массивами.

1 голос
/ 19 мая 2015

ниже Должно работать хорошо и более читабельно, используя <pre>

<?php 

ob_start();
echo '<pre>';
print_r($array);
$outputBuffer = ob_get_contents();
ob_end_flush();
file_put_contents('your file name', $outputBuffer);
?>
1 голос
/ 01 мая 2015

Вот что я узнал за последние 17 часов, что решило мою проблему при поиске аналогичного решения.

ресурсы:

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

Специальный код:

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

То, что я взял выше, $ arr [fruit] может идти внутрь "" (двойные кавычки) и приниматься PHP как строка для дальнейшей обработки.

Второй ресурс - это код в одном из ответов выше:

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

Это вторая вещь, которую я не знал, FILE_APPEND.

То, чего я пытался добиться, это получить содержимое из файла, отредактировать нужные данные и обновить файл новыми данными, но после удаления старых данных.

Теперь мне нужно знать, как удалить данные из файла, прежде чем добавлять обновленные данные.

О других решениях:

Только для того, чтобы это могло быть полезным для других людей; когда я пытался var_export или Print_r или Serialize или Json.Encode , я либо получал специальные символы, такие как => или; или 'или [] в файле или какая-то ошибка. Перепробовал слишком много вещей, чтобы запомнить все ошибки. Поэтому, если кто-то захочет попробовать их снова (может иметь другой сценарий, чем мой), он может ожидать ошибки.

О чтении файла, редактировании и обновлении:

Я использовал функцию fgets () , чтобы загрузить массив файлов в переменную ($ array) , а затем использовать unset ($ array [x]) ( где x обозначает желаемый номер массива, 1,2,3 и т. д.) для удаления конкретного массива. Затем используйте array_values ​​() для переиндексации и загрузки массива в другую переменную, а затем используйте цикла while и выше, чтобы выгрузить массив (без каких-либо специальных символов) в целевой файл .

$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++;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...