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

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

ただいまの
回答率

88.81%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 266

kokekoko

score 17

                    [a] => Array
                        (
                            [0] => Array
                                (
                                    [b] => 5
                                    [c] => 100
                                )
                        )
                    [d] => 0
                    [e] => 1

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/05/11 08:28 編集

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

    キャンセル

  • m.ts10806

    2019/05/11 08:29

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

    キャンセル

回答 2

+4

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/11 09:28 編集

    >ログ出力部分が変更可能であれば、

    むしろこれしかないように思います。
    あとから加工しやすいような形にしておくのもデータ保管の工夫のひとつですしね。

    キャンセル

checkベストアンサー

+1

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

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

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

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

<?php
class Test
{
  public $a = [
    [
      "b" => 5,
      "c" => 100,
      ],
    ];
    public $d = 0;
    public $e =1;
}
$test = new Test;
$tmp = print_r($test,true);
print_r(print_r_reverse($tmp));


function print_r_reverse($input) {
        $lines = preg_split('#\r?\n#', trim($input));
        if (trim($lines[ 0 ]) != 'Array' && trim($lines[ 0 ] != 'Test Object')) {
            // bottomed out to something that isn't an array or object
            if ($input === '') {
                return null;
            }

            return $input;
        } else {
            // this is an array or object, lets parse it
            $match = array();
            if (preg_match("/(\s{5,})\(/", $lines[ 1 ], $match)) {
                // this is a tested array/recursive call to this function
                // take a set of spaces off the beginning
                $spaces = $match[ 1 ];
                $spaces_length = strlen($spaces);
                $lines_total = count($lines);
                for ($i = 0; $i < $lines_total; $i++) {
                    if (substr($lines[ $i ], 0, $spaces_length) == $spaces) {
                        $lines[ $i ] = substr($lines[ $i ], $spaces_length);
                    }
                }
            }
            $is_object = trim($lines[ 0 ]) == 'stdClass Object';
            array_shift($lines); // Array
            array_shift($lines); // (
            array_pop($lines); // )
            $input = implode("\n", $lines);
            $matches = array();
            // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
            preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $input, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
            $pos = array();
            $previous_key = '';
            $in_length = strlen($input);
            // store the following in $pos:
            // array with key = key of the parsed array's item
            // value = array(start position in $in, $end position in $in)
            foreach ($matches as $match) {
                $key = $match[ 1 ][ 0 ];
                $start = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]);
                $pos[ $key ] = array($start, $in_length);
                if ($previous_key != '') {
                    $pos[ $previous_key ][ 1 ] = $match[ 0 ][ 1 ] - 1;
                }
                $previous_key = $key;
            }
            $ret = array();
            foreach ($pos as $key => $where) {
                // recursively see if the parsed out value is an array too
                $ret[ $key ] = print_r_reverse(substr($input, $where[ 0 ], $where[ 1 ] - $where[ 0 ]));
            }

            return $is_object ? (object)$ret : $ret;
        }
    }
?>
Array
(
    [a] => Array
        (
            [0] => Array
                (
                    [b] => 5
                    [c] => 100
                )

        )

    [d] => 0
    [e] => 1
)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/11 12:16

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

    キャンセル

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

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る