Печатать массив в файл

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

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

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

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

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

Либо var_export либо set 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)); 

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

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

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

 $fp = fopen('file.txt', 'w'); fwrite($fp, print_r($array, TRUE)); fclose($fp); 

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

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

 $h = fopen('filename.txt', 'r+'); fwrite($h, var_export($your_array, true)); 

Вы можете попробовать это, $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); 

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

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

ВАЖНАЯ ЗАМЕТКА:

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

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

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

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

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

 $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; } 

Быстро и просто:

 file_put_contents($filename, var_export($myArray, true)); 

Вот что я узнал за последние 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) ie number of lines in array $array { $txt= "$array[$x]"; file_put_contents("file.txt", $txt, FILE_APPEND); $x++; } 

Ниже должно работать красиво и читаемо с помощью <pre>

 <?php ob_start(); echo '<pre>'; print_r($array); $outputBuffer = ob_get_contents(); ob_end_flush(); file_put_contents('your file name', $outputBuffer); ?> 

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