質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

198閲覧

ログとして吐き出されたテキストを配列にしたい(PHP)

kokekoko

総合スコア17

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/05/10 22:54

編集2019/05/11 00:11
[a] => Array ( [0] => Array ( [b] => 5 [c] => 100 ) ) [d] => 0 [e] => 1

単純に書くとこういう感じで出力されたオブジェクトのログがあるのですが、これを配列にしたいです
explodeで分割していけばいいのでしょうけど区切り文字をいい感じに指定できません
いい方法はないでしょうか?

追記
おっしゃる通りログなのでそういう文字列です。
ただ、こういうデータがかつてあった、といったようなログのテキストしか存在せず、これをもとにforeachで回すなりして、SQLを一気に作りたいという感じです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/10 23:28 編集

ログの出力内容自体変えることはできませんか?「単純に書くと」とは仰っていますが実際はもっとさまざまな文字列が入ってくるわけですよね?正規表現使いまくっても厳しい気がします
m.ts10806

2019/05/10 23:29

あと「オブジェクトのログ」という表現が今一つピンときません。ログなのであくまでそういう文字列ですよね?型は配列のように見受けられますが
guest

回答2

0

記載いただいている出力はprint_r()関数の出力かと思われますが、
この文字列をそのまま変数に戻するような関数はありません。

ログ出力部分が変更可能であれば、json_encode() でログを出力、json_decode() で変数に戻す、ということが可能です。

投稿2019/05/10 23:31

Eggpan

総合スコア2727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/11 00:29 編集

>ログ出力部分が変更可能であれば、 むしろこれしかないように思います。 あとから加工しやすいような形にしておくのもデータ保管の工夫のひとつですしね。
guest

0

ベストアンサー

質問内容を「文字列として出力されたログを読み込んで配列として認識させたい」と理解しましたが、正しいですか?

未検証ですが、以下のような記事があります。
Convert var_dump of array back to array variable

いろいろ事情はあるでしょうが、個人的には、出力形式を変更するのが適切だと思います。
serialize(), var_export(), json_encode() あたりを使用すれば、再利用性は高まります。

[追記]var_dump() 前提で回答してましたが違うようですね^^;失礼。
マニュアルの User Contributed Notes の print_r_reverse() を少し加工することでイケそうです。

php

1<?php 2class Test 3{ 4 public $a = [ 5 [ 6 "b" => 5, 7 "c" => 100, 8 ], 9 ]; 10 public $d = 0; 11 public $e =1; 12} 13$test = new Test; 14$tmp = print_r($test,true); 15print_r(print_r_reverse($tmp)); 16 17 18function print_r_reverse($input) { 19 $lines = preg_split('#\r?\n#', trim($input)); 20 if (trim($lines[ 0 ]) != 'Array' && trim($lines[ 0 ] != 'Test Object')) { 21 // bottomed out to something that isn't an array or object 22 if ($input === '') { 23 return null; 24 } 25 26 return $input; 27 } else { 28 // this is an array or object, lets parse it 29 $match = array(); 30 if (preg_match("/(\s{5,})(/", $lines[ 1 ], $match)) { 31 // this is a tested array/recursive call to this function 32 // take a set of spaces off the beginning 33 $spaces = $match[ 1 ]; 34 $spaces_length = strlen($spaces); 35 $lines_total = count($lines); 36 for ($i = 0; $i < $lines_total; $i++) { 37 if (substr($lines[ $i ], 0, $spaces_length) == $spaces) { 38 $lines[ $i ] = substr($lines[ $i ], $spaces_length); 39 } 40 } 41 } 42 $is_object = trim($lines[ 0 ]) == 'stdClass Object'; 43 array_shift($lines); // Array 44 array_shift($lines); // ( 45 array_pop($lines); // ) 46 $input = implode("\n", $lines); 47 $matches = array(); 48 // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one) 49 preg_match_all("/^\s{4}[(.+?)] \=\> /m", $input, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); 50 $pos = array(); 51 $previous_key = ''; 52 $in_length = strlen($input); 53 // store the following in $pos: 54 // array with key = key of the parsed array's item 55 // value = array(start position in $in, $end position in $in) 56 foreach ($matches as $match) { 57 $key = $match[ 1 ][ 0 ]; 58 $start = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]); 59 $pos[ $key ] = array($start, $in_length); 60 if ($previous_key != '') { 61 $pos[ $previous_key ][ 1 ] = $match[ 0 ][ 1 ] - 1; 62 } 63 $previous_key = $key; 64 } 65 $ret = array(); 66 foreach ($pos as $key => $where) { 67 // recursively see if the parsed out value is an array too 68 $ret[ $key ] = print_r_reverse(substr($input, $where[ 0 ], $where[ 1 ] - $where[ 0 ])); 69 } 70 71 return $is_object ? (object)$ret : $ret; 72 } 73 } 74?>
Array ( [a] => Array ( [0] => Array ( [b] => 5 [c] => 100 ) ) [d] => 0 [e] => 1 )

投稿2019/05/10 23:30

編集2019/05/11 00:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokekoko

2019/05/11 03:16

詳細な回答参考になりました。 皆さんやはりログ出力の時点で、というご意見ですね。 残念ながら前任者が残したものがこれしかなく残念なものでしたので、頂いた情報をもとにやってみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問