Друкувати масив у файл


180

Я хотів би надрукувати масив у файл.

Я хотів би, щоб файл виглядав так само, як виглядає такий код.

print_r ($abc); припускаючи, що $ abc є масивом.

Чи є якесь рішення для цього рядка, а не регулярне для кожного погляду.

PS - В даний час я використовую serialize, але я хочу зробити файли читабельними, оскільки читабельність досить складна із серіалізованими масивами.

Відповіді:


308

Або 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] => бла" ??
користувач1899415

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

13
var_exportкраще, якщо ви хочете зберегти файл у синтаксисі php. print_rповертається, [m] => monkeyале var_exportповертається'm' => 'monkey'
Педрам Бехрозі

1
@Wold так, перевірте параметр $ flags у file_put_contents.
Гордон

5
@Використайте для цього прикладу FILE_APPEND : file_put_contents ('filename.txt', print_r ($ b, правда), FILE_APPEND); він додаватиме їх у кінці файлу, не перезаписуючи кожного разу. Крім того, ви можете змінити його на: print_r ($ b, правда). "\ n", щоб додати додатковий розрив рядка або новий рядок.
Тарік

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, інакше у файл немає вмісту для запису.
Прогрок

var_export був кращим рішенням у моєму досвіді, оскільки він обертає змінну масиву в лапки, тому краще справляється при використанні включати / вимагати для доступу до значень масиву
Pete - iCalculator


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 може працювати лише з одним масивом для другого аргументу.
користувач3610279

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 [фрукт] може зайти всередину "" (подвійні лапки) і бути прийнятим PHP як рядок для подальшої обробки.

Другий ресурс - код в одній з відповідей вище:

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

Це друге, що я не знав, FILE_APPEND.

Я намагався досягти вмісту з файлу, редагувати потрібні дані та оновлювати файл новими даними, але після видалення старих даних.

Тепер мені потрібно лише знати, як видалити дані з файлу, перш ніж додавати оновлені дані.

Про інші рішення:

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

Про читання файлів, редагування та оновлення:

Я використовував функцію fgets () для завантаження масиву файлів у змінну ($ масив), а потім використовував unset ($ масив [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.