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

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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

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

Этот 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;
  }

Ответ 8

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

Ответ 9

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

Ответ 10

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

<?php 

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

Ответ 11

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

Я нашел решение для себя, используя json_encode, поэтому кто-то еще ищет тот же код:

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

чем читать

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

Ответ 12

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."];");
}