配列をファイルに出力したいのですが。
このようなコードがどのように見えるかのように、ファイルをまったく同じように見せたいです。
print_r ($abc);
$ abcが配列であると仮定します。
外観ごとに通常ではなく、このための1行のソリューションはありますか?
PS-私は現在シリアライズを使用していますが、シリアライズされた配列では可読性が非常に難しいため、ファイルを読みやすくしたいと考えています。
配列をファイルに出力したいのですが。
このようなコードがどのように見えるかのように、ファイルをまったく同じように見せたいです。
print_r ($abc);
$ abcが配列であると仮定します。
外観ごとに通常ではなく、このための1行のソリューションはありますか?
PS-私は現在シリアライズを使用していますが、シリアライズされた配列では可読性が非常に難しいため、ファイルを読みやすくしたいと考えています。
回答:
どちらかvar_export
または設定しprint_r
、それを印刷するのではなく、出力を返すように。
$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));
implode
配列とPHP_EOL
結果の文字列をファイルに書き込みます。
var_export
ファイルをphp構文で保存する場合は、こちらをお勧めします。print_r
戻る[m] => monkey
がvar_export
戻る'm' => 'monkey'
使用するだけprint_r
です。)ドキュメントを読む:
の出力をキャプチャする場合は
print_r()
、return
パラメータを使用します。このパラメータがに設定されているTRUE
場合print_r()
は、情報を印刷するのではなく返します。
したがって、これは1つの可能性です。
$fp = fopen('file.txt', 'w');
fwrite($fp, print_r($array, TRUE));
fclose($fp);
あなたは試すことができます:
$h = fopen('filename.txt', 'r+');
fwrite($h, var_export($your_array, true));
true
パラメーターをvar_exportに追加します。追加しないと、ファイルに書き込む内容がありません。
これをすばやく簡単に実行します。
file_put_contents($filename, var_export($myArray, true));
配列をテキストとして出力するこの関数を書いたところです:
適切にフォーマットされた配列を出力する必要があります。
重要な注意点:
ユーザー入力に注意してください。
このスクリプトは内部で使用するために作成されました。
これをパブリックで使用する場合は、スクリプトインジェクションを防ぐために追加のデータ検証を追加する必要があります。
これは完全な証拠ではなく、信頼できるデータでのみ使用する必要があります。
次の関数は次のようなものを出力します:
$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;
}
file_put_contents('file',$myarray);
file_put_contents()を使用するだけで、配列でも機能します。
これは、過去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によって文字列として受け入れられ、さらに処理されます。
2番目のリソースは、上記の回答のいずれかのコードです。
file_put_contents($file, print_r($array, true), FILE_APPEND)
これは、知らなかった2番目のこと、FILE_APPENDです。
私が達成しようとしていたのは、ファイルからコンテンツを取得し、目的のデータを編集して、古いデータを削除した後、新しいデータでファイルを更新することです。
更新されたデータを追加する前に、ファイルからデータを削除する方法を知る必要があるだけです。
他のソリューションについて:
他の人の役に立つかもしれないように。私がしようとしたときでvar_exportもしくはますprint_rまたはシリアル化または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++;
}
しかし、opはファイルに配列を書き込む必要があるため、配列をファイルに書き込み、後でphpを使用して簡単に読み取ることができるソリューションを見つけるために、このページに移動しました。
私はjson_encodeを使用して自分自身の解決策を見つけたので、他の誰もが同じものを探しているここにコードがあります:
file_put_contents('array.tmp', json_encode($array));
読むより
$array = file_get_contents('array.tmp');
$array = json_decode($array,true);
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."];");
}