Мой PHP_EOL «\ r \ n», однако, когда я делаю print_r
в массиве, каждая новая строка имеет «\ n» – не «\ r \ n» – размещенную после него.
Любая идея, если можно изменить это поведение?
Использовать второй параметр в print_r
(установить true
), прочитать DOC: 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;
Если вы посмотрите исходный код 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; } }
в конечном итоге вы можете игнорировать материал arround zend_print_zval_r(var, 0 TSRMLS_CC);
для вашего вопроса.
Если вы выполните команду stacktrace, вы найдете:
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
используется print_r
та же жестко закодированная \n
строка-вещь.
Итак, чтобы ответить на ваш вопрос: вы не можете изменить его, чтобы использовать \r\n
. Используйте один из предоставленных обходных решений.
Sidenode: поскольку print_r
в основном используется для отладки, это также сделает работу:
echo "<pre>"; print_r($object); echo "</pre>";
Как указано в другом месте на этой странице, новые строки жестко закодированы в источнике 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
для PHP_EOL
строк. Обратите внимание, что он будет заменять только строки новой строки, например \n
, но не любые \r\n
которые могут иметься в $expression
. Это делается для того, чтобы не превратить \r\r\n
.
Преимущество этого в том, что он будет работать в качестве замены встроенной функции. Поэтому любой код, который уже использует родной print_r
может быть заменен простым добавлением оператора use.
Это может быть не самое элегантное решение, но вы можете захватить вывод print_r()
с помощью вывода буфера, а затем использовать str_replace()
для замены существующих \n
с помощью PHP_EOL
. В этом примере я заменил его на 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