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

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

ただいまの
回答率

88.09%

PHPでvar_dumpの結果をテキストと比較したい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 320

score 2

$arrayと$strを変えることなく、$is_matchをtrueにできませんでしょうか?

ある場面で$strとして確定したものがあるのですが、それが$arrayのvar_dumpであることを示したいと思っています

はじめから$strを別の形で出力しておけばと思いますが、とりあえず変えずにできれば知りたいです

// 変えない
$array = array('key'=>'value');

// 変えない
$str = 'array(1) {
  ["key"]=>
  string(5) "value"
}';

// 変えてもいい
$dump = var_dump($array);

// $strとして確定したものが、$arrayのvar_dumpであることを示したい
$is_match = $str === $dump;
var_dump( $is_match );
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m6u

    2020/08/14 16:19

    var_dump()の出力結果を変数に投入するのは、自分でPHPコードを書いて持たせるのですか?

    キャンセル

  • ikemen

    2020/08/14 16:28

    どういうことですか?自分で書く以外にできれば知りたいです

    キャンセル

回答 3

+2

var_export()を使うとか?
PHP: var\_export \- Manual
var_dump()の出力は(型名やサイズなど)あくまでデバッグ的情報が付帯して、
そのままPHPコード中に展開することは文法エラーを引き起こします。
var_export()を使えば、PHPコード中に展開しても文法エラーを起こしません。

あるいは、複雑なデータ構造すら文字列化するためには、
PHP: serialize \- Manual
でしょうか。

var_dump()による出力は直に変数に持たせることができず直接webブラウザに出力されるので、
質問文中に書いてあるような変数への代入はできません
PHP: var\_dump \- Manual

その出力を敢えて変数に持たせることの重要性がとくになければ、
例えばserialize()したあとの文字列を事前事後と比較すれば、
内容の一致を確認できるかと。

どう使うかは、それぞれのページのサンプルコードをご確認ください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/14 16:51

    今回はある人にvar_dumpで見せたデータ($str)がすでにあり、それを「ほら、$strは$arrayと同じですよね?」と見せる必要があるんですよね

    質問に「>はじめから$strを別の形で出力しておけばと思いますが」と書いた通りで、$strの出力方法に代替はできません

    $strは確定ですw

    キャンセル

  • 2020/08/14 16:57

    私の示す代替案は採用できない、ということはわかりました。
    では、そもそもどうやって実現するつもりだったのでしょうか。
    できるかどうかわからないやり方を模索して実現しようとしていて、私が「それできませんね」ってお伝えしている状況なので、
    もう一度段取りというか、誰(phpのコードを書く人 or webブラウザでアクセスする人)が何をやるのか、に着目して丁寧に説明いただきたいです。質問文中に。
    そして、私はこれで回答を区切ります。

    キャンセル

  • 2020/08/14 17:05

    よかったです!どうもでした!

    キャンセル

+2

var_dump()が、絶対条件であれば、 できません

$dump = var_dump($array);

は、var_dump - PHPマニュアル に

返り値 
値を返しません。

とあるように var_dump()は、画面出力だけでプログラムに値を返しませんので、 $dump は、null になるのではないかと思います。

var_dump()の結果を比較したいということであれば、画面に出力して目視で判断するしか方法は無いと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/14 17:42

    わたしも無理めと思い質問したのですけど、バッファでできました
    すごい人がいますねteratail、最高!

    キャンセル

checkベストアンサー

+1

本来は print_r($array, true) などで解決できるはずですが、比較対象の出力文字列が var_dump での出力になっているから var_dump() の出力を取得したい、ということですよね。

var_dump() は返り値を持たないの(標準出力に直接出力する)関数ですので、var_dump() そのものの出力を取得したいということであれば、出力バッファリングを利用する必要があるかと思います。

ob_start();
var_dump($array);
$dump = rtirm(ob_get_contents());
ob_end_clean();

ただし、既に出力バッファリングを利用している場合でそれ以前に出力がある場合はこの処理をする前に

  • 既存のバッファを取得
  • バッファをクリア

し、処理後にバッファに戻す必要があるかと思います。


// 変えない
$array = array('key'=>'value');

// 変えない
$str = 'array(1) {
  ["key"]=>
  string(5) "value"
}';

// 変えてもいい
// $dump = var_dump($array);

ob_start();
var_dump($array);
$dump = rtrim(ob_get_contents());
ob_end_clean();

// $strとして確定したものが、$arrayのvar_dumpであることを示したい
$is_match = ($str === $dump);
var_dump( $is_match );

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/14 17:17

    ああなるほど!バッファの中でダンプして、そのob_get_contents()を代入ですか!思いつきませんでした~

    あれ、しかしこちら↓かと思ったのですが、何か違いますか?
    できると思ったのですが、falseになってしまいました…

    <?php
    // 変えない
    $array = array('key'=>'value');

    // 変えない
    $str = 'array(1) {
    ["key"]=>
    string(5) "value"
    }';

    // 変えてもいい
    // $dump = var_dump($array);

    // 出力バッファリングを利用
    ob_start();
    var_dump($array);
    $dump = ob_get_contents();
    $is_match = $str === $dump;
    ob_end_clean();

    // $strとして確定したものが、$arrayのvar_dumpであることを示したい
    var_dump( $is_match );

    キャンセル

  • 2020/08/14 17:19

    今回答を修正しましたが、出力バッファの最後に改行があるため $str (改行で終わらない)と比較すると改行分違いがある状態でした。

    比較の時点でそういった差異を吸収するなりやりようはいろいろありますがとりあえず出力バッファの最後の改行(以外もごみになるものいろいろ)を `rtrim()` で削除したものと比較することでクリアできるかと思います。

    キャンセル

  • 2020/08/14 17:33

    私も改行を見つけまして、rtrimつけたり、逆に$strに改行をつけたり(これはルール違反ですが試しに)をしてみたのですが、やはりfalseのようでした
    てごわし…

    ob_end_clean();の後にvar_dump($dump);したら、目視ではどう見ても$strと同じなんですけどね

    キャンセル

  • 2020/08/14 17:35

    いえ、できてました!環境が特殊だったせいで、普通にやったら大丈夫でした
    ありがとうございましたー!!

    キャンセル

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

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

関連した質問

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