Jqueryでphpを呼び出して、JSONで受け取るコードをつくって、テストでサーバーにアップしてみても、全然動かない。
なんでかなー、記述が間違っているのかとあれこれと小一時間ほど奮闘しても動かない。
訳がわからなくなって、もう別の作業をしようとサーバーログを見ていたら、大量に以下のエラーが吐き出されていた。
PHP Fatal error: Call to undefined function json_encode()
まさか、json_encodeが使えないとは思ってもいなかったから、びっくり。
調べるとphp5.1以前はjson_encodeに対応していないとのこと。
どうしよう...、と途方にくれながらネットで探していると、json_encode関数を書いてくださっている方がいたのでそれを使えば問題なく動作しました。感謝。
以下のソースをコピーして、例えば、function.json_encode.php という名前でアップロードします。
参考ソース:[PHP] PHP5.1以前の環境で使えるjson_encode関数
<?php
if (!function_exists('json_encode')) {
function json_encode($it) {
if (!($assoc = is_object($it)) && !is_array($it)) {
return _js_enc_value($it);
}
$i = 0;
$it = (array)$it;
if (!$assoc) {
foreach ($it as $k => $v) {
if ($k !== $i) {
$assoc = true;
break;
}
$i++;
}
}
$data = array();
foreach ($it as $k => $v) {
$v = _js_enc_value($v);
if ($assoc) {
$k = _js_enc_value((string)$k);
$data[] = $k . ':' . $v;
} else {
$data[] = $v;
}
}
if ($assoc) {
$bl = '{';
$br = '}';
} else {
$bl = '[';
$br = ']';
}
return $bl . implode(',', $data) . $br;
}
function _js_enc_value($value) {
switch (true) {
case is_array($value):
case is_object($value):
return json_encode($value);
case $value === null:
case is_resource($value):
return 'null';
case is_bool($value):
return $value ? 'true' : 'false';
case is_string($value):
return '"' . _js_uc_esc($value) . '"';
default:
return $value;
}
}
function _js_uc_esc($value) {
$pattern = "@[\x08-\x0a\x0c\x0d\\\\\"/]|([^\x08-\x0a\x0c\x0d\x20-\x7f\\\\\"/])++@u";
return preg_replace_callback($pattern, '_js_uc_esc_cb', $value);
}
function _js_uc_esc_cb($matches) {
switch (true) {
case isset($matches[1]):
$char = mb_convert_encoding($matches[0], 'UTF-16', 'UTF-8');
$str = '';
$len = strlen($char);
for ($i = 0; $i < $len; $i += 2) {
$str .= sprintf('\\u%02x%02x',
ord($char[$i]),
ord($char[$i + 1])
);
}
return $str;
default:
return addcslashes($matches[0], "\x08\x09\x0a\x0c\x0d\\\"/");
}
}
}
そして、json_encodeを使うphpファイルに以下のようにしてfunction.json_encode.phpを呼び出せばOK
require_once("function.json_encode.php");


