मैं स्ट्रिंग को var_dump का परिणाम कैसे पकड़ सकता हूं?


605

मैं var_dumpएक स्ट्रिंग के आउटपुट को कैप्चर करना चाहूंगा ।

PHP प्रलेखन कहता है;

जैसा कि कुछ भी है जो इसके परिणाम को सीधे ब्राउज़र में आउटपुट करता है, आउटपुट-फ़ंक्शन फ़ंक्शन का उपयोग इस फ़ंक्शन के आउटपुट को कैप्चर करने के लिए किया जा सकता है, और इसे एक स्ट्रिंग (उदाहरण के लिए) में सहेज सकता है।

इस बात का उदाहरण क्या होगा कि कैसे काम किया जा सकता है?

print_r() एक वैध संभावना नहीं है, क्योंकि यह मुझे वह जानकारी नहीं देने वाली है जिसकी मुझे आवश्यकता है।

जवाबों:


601

आउटपुट बफ़रिंग का उपयोग करें:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>

8
आउटपुट बफ़रिंग का उपयोग करने से यहां प्रदर्शन पर नकारात्मक प्रभाव पड़ेगा। यदि आप एक जटिल स्क्रिप्ट के निष्पादन के दौरान कई चर को देखने की जरूरत है तो यह वास्तव में गड़बड़ हो सकता है।
selfawaresoup

83
@Inwdr मैंने केवल डिबगिंग के लिए सुविधा की सुविधा के रूप में var_dump का उपयोग किया है, और निश्चित रूप से उत्पादन कोड में var_dump स्टेटमेंट को कभी नहीं छोड़ा है। मुझे लगता है कि यह विशिष्ट है। उन परिस्थितियों में, प्रदर्शन सभी प्रासंगिक होने की संभावना नहीं है।
मार्क ऐमी

पठनीयता के लिए टैग भी हटा दें (यदि आप केवल स्ट्रिंग चाहते हैं), का उपयोग करके strip_tags(), यह बस प्रकार और मान लौटाएगा।
अनिल

11
यह प्रश्न का एक अच्छा शाब्दिक उत्तर है, क्योंकि आप 'कैप्चर [आईएनजी] एक स्ट्रिंग_ के लिए एक var_dump का परिणाम है' जैसा कि पूछा गया था। var_export () आत्मा में एक बेहतर उत्तर है, क्योंकि यह आम तौर पर अधिक समझ में आता है।
Qaribou

1
@AlbertHendriks मैं var_dump को प्राथमिकता देता हूं। Xdebug सक्षम होने से आपको एक सुंदर डेटा प्रदर्शित होता है।
रोजबेक

880

प्रयत्न var_export

आप इसकी जांच करना चाहते हैं var_export- जबकि यह एक ही आउटपुट प्रदान नहीं करता है क्योंकि var_dumpयह एक दूसरा $returnपैरामीटर प्रदान करता है जो इसे प्रिंट करने के बजाय इसके आउटपुट को वापस करने का कारण होगा:

$debug = var_export($my_var, true);

क्यों?

मैं इस एक-लाइनर का उपयोग करना पसंद करता हूं ob_startऔर ob_get_clean()। मुझे यह भी पता चला कि आउटपुट पढ़ना थोड़ा आसान है, क्योंकि यह सिर्फ PHP कोड है।

के बीच का अंतर var_dumpऔर var_exportवह यह है कि var_exportरिटर्न एक "एक चर के parsable स्ट्रिंग प्रतिनिधित्व" जबकि var_dumpबस एक चर के बारे में जानकारी उदासीनता। व्यवहार में इसका मतलब यह है कि var_exportआपको वैध PHP कोड देता है (लेकिन आपको चर के बारे में बहुत अधिक जानकारी नहीं दे सकता है, खासकर यदि आप संसाधनों के साथ काम कर रहे हैं )।

डेमो:

$demo = array(
    "bool" => false,
    "int" => 1,
    "float" => 3.14,
    "string" => "hello world",
    "array" => array(),
    "object" => new stdClass(),
    "resource" => tmpfile(),
    "null" => null,
);

// var_export -- nice, one-liner
$debug_export = var_export($demo, true);

// var_dump
ob_start();
var_dump($demo);
$debug_dump = ob_get_clean();

// print_r -- included for completeness, though not recommended
$debug_printr = print_r($demo, true);

उत्पादन में अंतर:

var_export ( $debug_exportउपरोक्त उदाहरण में):

 array (
  'bool' => false,
  'int' => 1,
  'float' => 3.1400000000000001,
  'string' => 'hello world',
  'array' => 
  array (
  ),
  'object' => 
  stdClass::__set_state(array(
  )),
  'resource' => NULL, // Note that this resource pointer is now NULL
  'null' => NULL,
)

var_dump ( $debug_dumpउपरोक्त उदाहरण में):

 array(8) {
  ["bool"]=>
  bool(false)
  ["int"]=>
  int(1)
  ["float"]=>
  float(3.14)
  ["string"]=>
  string(11) "hello world"
  ["array"]=>
  array(0) {
  }
  ["object"]=>
  object(stdClass)#1 (0) {
  }
  ["resource"]=>
  resource(4) of type (stream)
  ["null"]=>
  NULL
}

Print_r ( $debug_printrउपरोक्त उदाहरण में):

Array
(
    [bool] => 
    [int] => 1
    [float] => 3.14
    [string] => hello world
    [array] => Array
        (
        )

    [object] => stdClass Object
        (
        )

    [resource] => Resource id #4
    [null] => 
)

कैविएट: var_exportपरिपत्र संदर्भों को नहीं संभालता है

यदि आप किसी चर को परिपत्र संदर्भों के साथ डंप करने का प्रयास कर रहे हैं, तो कॉलिंग var_exportका परिणाम PHP चेतावनी होगा:

 $circular = array();
 $circular['self'] =& $circular;
 var_export($circular);

का परिणाम:

 Warning: var_export does not handle circular references in example.php on line 3
 array (
   'self' => 
   array (
     'self' => NULL,
   ),
 )

दोनों var_dumpऔर print_r, दूसरे हाथ पर, इच्छा उत्पादन स्ट्रिंग *RECURSION*जब वृत्तीय संदर्भ का सामना।


11
यह निश्चित रूप से स्वीकृत एक से बेहतर उत्तर है। मुझे आश्चर्य है कि यह अधिक upvotes नहीं है! क्या आप इस बात की विस्तृत जानकारी दे सकते हैं कि वह वह सारी जानकारी नहीं दे सकता है जिसकी उसे तलाश है?
जेएम टायलर

7
@JMTyler var_export एक रिटर्न देता है पार्सबल स्ट्रिंग - अनिवार्य रूप से PHP कोड - जबकि var_dump डेटा का एक कच्चा डंप प्रदान करता है। इसलिए, उदाहरण के लिए, यदि आप 1 के मान के साथ पूर्णांक पर var_dump को कॉल करते हैं, तो यह प्रिंट होगा int(1)जबकि var_export सिर्फ प्रिंट करता है 1
inxilpro

4
यदि आप इसे $ GLOBALS के साथ उपयोग करते हैं तो var_export भूमि इसके पेट पर है।
ओलाफ

3
स्वयं के संदर्भ वाले चर के साथ काम नहीं करेगा .. var_export var_dump की तरह काम नहीं करता है; इस तरह, $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
हंसेनरिक्रीक

3
लोगों को धोखा देना बंद करें। var_exportवास्तव में डिबगिंग के लिए बेहतर नहीं है क्योंकि आप एक ब्राउज़र खोज (int)(या स्ट्रिंग) के लिए नहीं कर सके `और आदि यह भी एक छोटी सी जगह में जानकारी का एक बहुत मांग करता है, बस कोशिश करें var_export(''); var_export('\'');:। और सबसे महत्वपूर्ण बात, PHP घातक त्रुटि के लिए तैयार हो जाओ : घोंसले का स्तर बहुत गहरा है - पुनरावर्ती निर्भरता? C: \ path \ file.php लाइन 75 पर
पेसियर

76

आप यह भी कर सकते हैं:

$dump = print_r($variable, true);

17
मैंने विशेष रूप से हालांकि var_dump का उल्लेख किया है :)
मार्क bwk

7
मैं व्यक्तिगत रूप से उपयोग print_rकर सकता हूं जहां मैं कर सकता हूं, लेकिन दुर्भाग्य से कभी-कभी यह पर्याप्त जानकारी प्रदान नहीं करता है। उदाहरण के लिए, चूंकि यह स्ट्रिंग को कास्ट करता है, जहां यह दोनों हो सकता है, falseऔर nullएक खाली स्ट्रिंग के रूप में दिखा सकता है । ऐसे मामलों में जहां मुझे इन दोनों के बीच अंतर की परवाह है, मैं var_dumpया तो सहारा लेना चाहूंगा या नहीं var_export
JMTyler

15

आप serialize()फ़ंक्शन का उपयोग करने का प्रयास भी कर सकते हैं । कभी-कभी यह डीबगिंग उद्देश्यों के लिए बहुत उपयोगी है।


7
चेतावनी का एक शब्द - अगर कारण है कि आप एक स्ट्रिंग के रूप उत्पादन चाहते करने के लिए है error_logयह, आप, इस समाधान का उपयोग नहीं करना चाहिए के बाद से serialize के उत्पादन अशक्त बाइट्स और शामिल कर सकते हैं error_log ट्रंकेटस अशक्त बाइट्स वाले तार
मार्क अमेरी

15
function return_var_dump(){
    // It works like var_dump, but it returns a string instead of printing it.
    $args = func_get_args(); // For <5.3.0 support ...
    ob_start();
    call_user_func_array('var_dump', $args);
    return ob_get_clean();
}

4
@ मकर्मी सच लगता है। मैंने अभी इसे आसान बनाया है।
हैनसेन्रिक

13

echo json_encode($dataobject);सहायक भी हो सकता है


1
इस मामले में, आउटपुट बहुत भ्रामक है और मेरी राय में डिबग उद्देश्य से बहुत दूर है।
टॉम ज़ातो - मोनिका

2
मार्क Biek ने डिबगिंग के बारे में कुछ नहीं कहा, क्या उन्होंने? हो सकता है कि उसे सिर्फ डीबी में बचाई गई वस्तु चाहिए। इस मामले में मेरी पेशकश की विधि अच्छी तरह से काम करेगी। वैसे भी सिर के लिए धन्यवाद, टॉम Zato।
ZurabWeb

वैसे भी, json_encodeसभी डेटा शामिल नहीं होंगे var_dump(उदाहरण के लिए चर प्रकार)। json_encodeएक ही जानकारी को print_Rअलग-अलग प्रारूप में, आउटपुट करता है।
टॉम ज़ातो -

1
ठीक है, मैं इसे एक बार फिर समझाऊंगा । ओटी ने कहा कि उसे आउटपुट की जरूरत है var_dump। उन्होंने यह भी कहा कि print_Rउनकी आवश्यकताओं के लिए अपर्याप्त जानकारी प्रदान करता है। दी गई जानकारी में कोई वास्तविक अंतर नहीं है json_encodeऔर print_r- केवल डेटा प्रारूप अलग है। यह देखते हुए, यदि print_rअपर्याप्त है, तो है json_encode। कृपया नीचे अब और शिकायत न करें। यह स्पष्ट रूप से सिर्फ यादृच्छिक क्लिक नहीं था, इसलिए इससे निपटें।
टॉम ज़ातो -

9

PHP मैनुअल से :

यह फ़ंक्शन एक या अधिक अभिव्यक्तियों के बारे में संरचित जानकारी प्रदर्शित करता है जिसमें इसके प्रकार और मूल्य शामिल हैं।

तो, यहाँ PHP का वास्तविक रिटर्न संस्करण है var_dump(), जो वास्तव में एक चर-लंबाई तर्क सूची को स्वीकार करता है:

function var_dump_str()
{
    $argc = func_num_args();
    $argv = func_get_args();

    if ($argc > 0) {
        ob_start();
        call_user_func_array('var_dump', $argv);
        $result = ob_get_contents();
        ob_end_clean();
        return $result;
    }

    return '';
}

1
वास्तविक प्रश्न का वास्तविक उत्तर प्रदान करने के लिए +1। मैं इसे पढ़ रहा हूँ क्योंकि मुझे var_dump की आवश्यकता है, var_export, print_r, serialize, json_encode, या एक वास्तविक डीबगर की नहीं। मुझे पता है कि उन का उपयोग कैसे करें। OP ने var_dump के लिए कहा, मुझे var_dump की आवश्यकता है। धन्यवाद!
स्लैशबैक

यदि आप var_dump के लिए सही रहना चाहते हैं, तो आपको ट्रिगर_रोर करना होगा ("var_dump_str ()" के लिए गलत पैरामीटर गणना)); जब argc <= 0; या बेहतर अभी तक, आपके लिए var_dump है। : पी
हेंशेंरिक

यह बहुत कुछ जोड़ता है जो पहले से ही स्वीकृत उत्तर में नहीं था। यहाँ $argcचेक अनावश्यक और यकीनन गलत है जैसा कि @hanshenrik द्वारा बताया गया है, और एक बार जब आप इसे हटा देते हैं तो आप वास्तव में जोड़ रहे हैं call_user_func_arrayऔर func_get_argsकॉल है।
मार्क अमेरी

5

यदि आप रनवे के दौरान एक चर की सामग्री पर एक नज़र रखना चाहते हैं, तो XDebug जैसे वास्तविक डिबगर का उपयोग करने पर विचार करें। इस तरह आपको अपने स्रोत कोड को गड़बड़ाने की आवश्यकता नहीं है, और सामान्य उपयोगकर्ता आपके एप्लिकेशन पर जाने के दौरान भी आप डिबगर का उपयोग कर सकते हैं। वे ध्यान नहीं देंगे।


5

यहाँ एक समारोह के रूप में पूरा समाधान है:

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}

2
1 से अधिक चर के साथ काम नहीं करेगा ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar")>> string (3) "foo"
hanshenrik

2

यह शायद थोड़ा सा विषय है।

मैं अपने PHP-FPM कंटेनर के डॉकर लॉग में इस तरह की जानकारी लिखने का एक तरीका ढूंढ रहा था और नीचे स्निपेट के साथ आया। मुझे यकीन है कि यह डॉकर PHP-FPM उपयोगकर्ताओं द्वारा उपयोग किया जा सकता है।

fwrite(fopen('php://stdout', 'w'), var_export($object, true));

1
संभाल को कभी भी बंद नहीं किया जाता है, इसलिए यह एक संसाधन रिसाव है, जो लंबे समय से चलने वाली डेमन-शैली लिपियों में एक समस्या हो सकती है। लेकिन कोशिश करेंfile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
हैंशेनरिक

0

मैं वास्तव में की तरह var_dump()'उत्पादन वर्बोज़ है और से संतुष्ट नहीं था var_export()की या print_r()के उत्पादन, क्योंकि यह अधिक से अधिक जानकारी के रूप में नहीं दिया (जैसे डेटा प्रकार लापता, लंबाई लापता)।

सुरक्षित और पूर्वानुमेय कोड लिखने के लिए, कभी-कभी खाली स्ट्रिंग और अशक्त के बीच अंतर करना उपयोगी होता है। या 1 और एक सच्चे के बीच। या एक अशक्त और झूठे के बीच। इसलिए मैं आउटपुट में अपना डेटा टाइप चाहता हूं।

यद्यपि मददगार, मुझे var_dump()html टैग्स के बिना एक स्ट्रिंग में मानव-पठनीय आउटपुट के रंगीन आउटपुट को स्ट्रिंग में परिवर्तित करने के लिए मौजूदा प्रतिक्रियाओं में एक साफ और सरल समाधान नहीं मिला var_dump()

ध्यान दें कि यदि आपके पास एक रंग है var_dump(), तो इसका मतलब है कि आपके पास Xdebug स्थापित है जो var_dump()html रंगों को जोड़ने के लिए php के डिफ़ॉल्ट को ओवरराइड करता है ।

इस कारण से, मैंने यह थोड़ी भिन्नता पैदा की कि मुझे क्या चाहिए:

function dbg_var_dump($var)
    {
        ob_start();
        var_dump($var);
        $result = ob_get_clean();
        return strip_tags(strtr($result, ['=&gt;' => '=>']));
    }

नीचे दी गई अच्छी स्ट्रिंग लौटाता है:

array (size=6)
  'functioncall' => string 'add-time-property' (length=17)
  'listingid' => string '57' (length=2)
  'weekday' => string '0' (length=1)
  'starttime' => string '00:00' (length=5)
  'endtime' => string '00:00' (length=5)
  'price' => string '' (length=0)

आशा है कि यह किसी की मदद करता है।


-2

से http://htmlexplorer.com/2015/01/assign-output-var_dump-print_r-php-variable.html :

var_dump और print_r फ़ंक्शंस केवल सीधे ब्राउज़र में आउटपुट कर सकते हैं। तो इन कार्यों के आउटपुट को केवल php के आउटपुट कंट्रोल फ़ंक्शन का उपयोग करके पुनर्प्राप्त किया जा सकता है। आउटपुट बचाने के लिए नीचे विधि उपयोगी हो सकती है।

function assignVarDumpValueToString($object) {
    ob_start();
    var_dump($object);
    $result = ob_get_clean();
    return $result;
}

ob_get_clean () केवल आंतरिक बफर में दर्ज अंतिम डेटा को साफ कर सकता है। यदि आपके पास एकाधिक प्रविष्टियाँ हैं तो ob_get_contents पद्धति उपयोगी होगी।

ऊपर के समान स्रोत से:

function varDumpToErrorLog( $var=null ){
    ob_start();                    // start reading the internal buffer
    var_dump( $var);          
    $grabbed_information = ob_get_contents(); // assigning the internal buffer contents to variable
    ob_end_clean();                // clearing the internal buffer.
    error_log( $grabbed_information);        // saving the information to error_log
}

1
कृपया ठीक से इंगित करें जब आप किसी अन्य स्रोत से सामग्री उद्धृत कर रहे हों। इससे पहले कि मैं संपादित करने वाला हूं, इस उत्तर का एकमात्र भाग एक उद्धरण के रूप में स्वरूपित किया गया हिस्सा है जिसे आपने किसी के ब्लॉग से कॉपी और पेस्ट नहीं किया है
मार्क अमेरी

-2

लंबी स्ट्रिंग : echo($var);इसके बजाय बस का उपयोग करें dump($var);

ऑब्जेक्ट या ऐरे :var_dump('<pre>'.json_encode($var).'</pre>);'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.