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

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

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

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

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

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

131
13 апр. '10 в 13:34
источник поделиться
10 ответов

Либо 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));
236
13 апр. '10 в 13:36
источник

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

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

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

$fp = fopen('file.txt', 'w');
fwrite($fp, print_r($array, TRUE));
fclose($fp);
39
13 апр. '10 в 13:38
источник

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

22
13 апр. '10 в 13:40
источник

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

$h = fopen('filename.txt', 'r+');
fwrite($h, var_export($your_array, true));
16
13 апр. '10 в 13:38
источник

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

file_put_contents($filename, var_export($myArray, true));
4
04 июня '15 в 18:57
источник

Вы можете попробовать это, $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
05 окт. '12 в 9:03
источник

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

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

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

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

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

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

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

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

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

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

Это полезно скопировать и вставить части массива.

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

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

Этот вывод будет выводиться следующим образом:

$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
15 апр. '13 в 22:12
источник

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

ресурсы:

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

Конкретный код:

// The following is okay, as it 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 или Сериализовать или Json.Encode, я либо получил специальные символы, например = > или; или 'или [] в файле или какая-либо ошибка. Пробовал слишком много вещей, чтобы запомнить все ошибки. Поэтому, если кто-то захочет попробовать их снова (может иметь другой сценарий, чем мой), они могут ожидать ошибки.

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

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

$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
01 мая '15 в 14:16
источник

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

<?php 

ob_start();
echo '<pre>';
print_r($array);
$outputBuffer = ob_get_contents();
ob_end_flush();
file_put_contents('your file name', $outputBuffer);
?>
1
19 мая '15 в 13:38
источник

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

0
03 марта '16 в 11:40
источник

Посмотрите другие вопросы по меткам или Задайте вопрос