Skip to content

Instantly share code, notes, and snippets.

@drazisil
Last active October 12, 2021 16:15
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drazisil/eda9065698dd0beedede to your computer and use it in GitHub Desktop.
Save drazisil/eda9065698dd0beedede to your computer and use it in GitHub Desktop.
Pretty-print a JSON string in PHP.
<?php
/**
* Formats a JSON string for pretty printing
*
* @param string $json The JSON to make pretty
* @param bool $html Insert nonbreaking spaces and <br />s for tabs and linebreaks
* @return string The prettified output
* @author Jay Roberts
*/
function _format_json($json, $html = false) {
$tabcount = 0;
$result = '';
$inquote = false;
$ignorenext = false;
if ($html) {
$tab = "&nbsp;&nbsp;&nbsp;";
$newline = "<br/>";
} else {
$tab = "\t";
$newline = "\n";
}
for($i = 0; $i < strlen($json); $i++) {
$char = $json[$i];
if ($ignorenext) {
$result .= $char;
$ignorenext = false;
} else {
switch($char) {
case '{':
$tabcount++;
$result .= $char . $newline . str_repeat($tab, $tabcount);
break;
case '}':
$tabcount--;
$result = trim($result) . $newline . str_repeat($tab, $tabcount) . $char;
break;
case ',':
$result .= $char . $newline . str_repeat($tab, $tabcount);
break;
case '"':
$inquote = !$inquote;
$result .= $char;
break;
case '\\':
if ($inquote) $ignorenext = true;
$result .= $char;
break;
default:
$result .= $char;
}
}
}
return $result;
}
@peter279k
Copy link

Why don't we just use the json_decode() with JSON_PRETTY_PRINT option? The function usage is as follows:

json_encode(['key' => 'value'], JSON_PRETTY_PRINT)

@peter279k
Copy link

Just provide the following this _format_json function and json_encode difference.

>>> json_encode(['key' => 'value'], JSON_PRETTY_PRINT)
=> """
   {\n
       "key": "value"\n
   }
   """
>>> _format_json(json_encode(['key' => 'value']))
=> """
   {\n
   \t"key":"value"\n
   }
   """
>>> 

It seems that these are different formatted JSON string, but their purposes are same.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment