использование print_r PHP_EOL

Мой PHP_EOL «\ r \ n», однако, когда я делаю print_r в массиве, каждая новая строка имеет «\ n» – не «\ r \ n» – размещенную после него.

Любая идея, если можно изменить это поведение?

Solutions Collecting From Web of "использование print_r PHP_EOL"

Использовать второй параметр в 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