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


181

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

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

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

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

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

Ответы:


309

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

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

14
@ user1899415 implodeмассив с PHP_EOLи записать полученную строку в файл.
Гордон

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

1
@ Да, проверьте параметр $ flags в file_put_contents.
Гордон

5
@Wold использует FILE_APPEND для этого примера: file_put_contents ('filename.txt', print_r ($ b, true), FILE_APPEND); он добавит их в конец файла без перезаписи каждый раз. Кроме того, вы можете изменить его на: print_r ($ b, true). «\ n», чтобы добавить дополнительный разрыв строки или новую строку.
Tarik

53

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

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

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

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


25

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

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

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

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

8

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

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

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',
  ),
);

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

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

2

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


2
По моему мнению, это действительно должен быть принятый ответ, хотя стоит отметить, что file_put_contents может работать только с одним массивом в качестве второго аргумента.
user3610279

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

То, что я взял выше, $ 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++;
    }

1

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

<?php 

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

1

Однако op должен записать массив в том виде, в каком он есть в файле. Я нашел эту страницу, чтобы найти решение, в котором я могу записать массив в файл, а затем легко прочитать позже, снова используя php.

Я нашел решение сам с помощью json_encode, так что кто-то еще ищет тот же код:

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

чем читать

$array = file_get_contents('array.tmp');
$array = json_decode($array,true);

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."];");
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.