2010-04-13 2 views
136

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

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

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

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

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

ответ

241

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

Example from PHP manual

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

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

Вы можете сохранить $resultsfile_put_contents с. Или вернуть его непосредственно при записи в файл:

file_put_contents('filename.txt', print_r($b, true)); 
+0

Как вы можете ТОЛЬКО сохранять содержимое массива, а не весь массив "[0] => blah" ?? – user1899415

+11

@ user1899415 'implode' массив с' PHP_EOL' и записать результирующую строку в файл. – Gordon

+10

'var_export' лучше, если вы хотите сохранить файл в синтаксисе php. 'print_r' возвращает' [m] => monkey', но 'var_export' возвращает' 'm '=>' monkey'' –

17

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

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

Добавьте второй параметр 'true' в var_export, иначе нет содержимого для записи в файл. – Progrock

+0

var_export было лучшим решением в моем опыте, поскольку оно обертывает переменную массива в кавычках, поэтому лучше обрабатывать при использовании include/require для доступа к значениям массива –

42

Просто используйте print_r;) Прочитайте documentation:

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

Так что это одна возможность:

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

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

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

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

ВАЖНО:

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

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

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

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

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

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

здесь функция (примечание:. Функция в настоящее время отформатирован для реализации ООП)

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; 
    } 
+1

Насколько я знаю, print_r не выводит данные в формате, который можно скопировать, и вставлен как рабочий php-код. Это будет форматировать вывод таким образом, который можно скопировать и вставить как рабочий массив. –

1

Вот что я узнал за последние 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 

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

Второй ресурс является кодом в одном из приведенных выше ответов:

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

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

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

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

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

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

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

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

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

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

<?php 

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

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

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

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

Смежные вопросы