2014-07-09 29 views
3

我的PHP_EOL是「\ r \ n」,但是當我在數組上執行print_r時,每行都有一個「\ n」 - 而不是「\ r \ n」 - 放在它後面。製作print_r使用PHP_EOL

任何想法是否有可能改變這種行爲?

+0

'\ r \ n'是針對windows和'\ n'的,在linux上是 – meda

回答

3

使用在print_r(設定true),讀DOC第二PARAM: http://www.php.net/manual/en/function.print-r.php

參見: mixed print_r (mixed $expression [, bool $return = false ]);

例子:

$eol = chr(10); //Break line in like unix 
$weol = chr(13) . $eol; //Break line with "carriage return" (required by some text editors) 
$data = print_r(array(...), true); 
$data = str_replace(eol, weol, $data); 
echo $data; 
+1

Inchpinching:實際上你的措辭不正確 - '\ n'是windows AND unix的換行符。 Windows只需要額外的'\ r'(回車) – dognose

+0

@dognose謝謝! –

0

這可能不是最完美的解決方案,但你可以捕捉到print_r()輸出使用緩衝輸出,然後用str_replace()PHP_EOL取代的\n存在性。在這個例子中,我與x取代它,以表明它的工作...

ob_start(); 

$test_array = range('A', 'Z'); 
print_r($test_array); 

$dump = ob_get_contents(); 
ob_end_clean(); 

正如dognose指出,自PHP 4.3你可以返回的print_r()結果轉換成字符串(更優雅):

$dump = print_r($test_array, true); 

然後替換行結尾:

$dump = str_replace("\n", "x" . PHP_EOL, $dump); 
echo $dump; 

輸出:

Arrayx 
(x 
    [0] => Ax 
    [1] => Bx 
    [2] => Cx 
    [3] => Dx 
    [4] => Ex 
    [5] => Fx 
    [6] => Gx 
    ... etc 
    [25] => Zx 
)x 
+2

,實際上這並不優雅。你可以使用'$ val = print_r($ something,true);'因爲php 4.3 – dognose

+1

@dognose不錯的一個 –

4

如果你看的print_r的源代碼,你會發現:

PHP_FUNCTION(print_r) 
{ 
    zval *var; 
    zend_bool do_return = 0; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &var, &do_return) == FAILURE) { 
     RETURN_FALSE; 
    } 

    if (do_return) { 
     php_output_start_default(TSRMLS_C); 
    } 

    zend_print_zval_r(var, 0 TSRMLS_CC); 

    if (do_return) { 
     php_output_get_contents(return_value TSRMLS_CC); 
     php_output_discard(TSRMLS_C); 
    } else { 
     RETURN_TRUE; 
    } 
} 

最終可以忽略的東西角落找尋zend_print_zval_r(var, 0 TSRMLS_CC);你的問題。

如果按照堆棧跟蹤,你會發現:

ZEND_API void zend_print_zval_r(zval *expr, int indent TSRMLS_DC) /* {{{ */ 
{ 
    zend_print_zval_r_ex(zend_write, expr, indent TSRMLS_CC); 
} 

導致

ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int indent TSRMLS_DC) /* {{{ */ 
{ 
    switch (Z_TYPE_P(expr)) { 
     case IS_ARRAY: 
      ZEND_PUTS_EX("Array\n"); 
      if (++Z_ARRVAL_P(expr)->nApplyCount>1) { 
       ZEND_PUTS_EX(" *RECURSION*"); 
       Z_ARRVAL_P(expr)->nApplyCount--; 
       return; 
      } 
      print_hash(write_func, Z_ARRVAL_P(expr), indent, 0 TSRMLS_CC); 
      Z_ARRVAL_P(expr)->nApplyCount--; 
      break; 

從這一點上,你可以繼續找相關線路 - 但因爲有已經是一個硬編碼"Array\n" - 我會假設print_r實現的其餘部分使用相同的硬編碼\n換行符。

所以,要回答你的問題:你不能改變它使用\r\n。 使用提供的解決方法之一。

Sidenode:由於print_r主要用於調試,這將做的工作還有:

echo "<pre>"; 
print_r($object); 
echo "</pre>"; 
+0

我標記了Guilherme Nascimento的回答,因爲它提供了一種解決方法,但我更喜歡你的答案。我欣賞並尊重你的徹底! – neubert

1

如同指出別處此頁面上,新行被硬編碼在PHP源代碼,所以你必須手動替換它們。

你可以使用自己的print_r版本是這樣的:

namespace My; 

function print_r($expression, $return = false) 
{ 
    $out = \print_r($expression, true); 
    $out = \preg_replace("#(?<!\r)\n#", PHP_EOL, $out); 
    if ($return) { 
     return $out; 
    } 
    echo $out; 
    return true; 
} 

每當你想使用它,你只需用

// aliasing a function (PHP 5.6+) 
use My\print_r as print_r; 

print_r("A string with \r\n is not replaced"); 
print_r("A string with \n is replaced"); 

導入它,然後這將使用PHP_EOL的換行符。請注意,它只會替換換行符,例如\n,但沒有任何\r\n您可能在$expression。這是爲了防止任何\r\n變爲\r\r\n

這樣做的好處是它可以作爲原生函數的替代替代品。因此,任何已經使用本地print_r的代碼都可以簡單地通過添加use語句來替換。