сергей щучкин

[info]shuchkin


Лента программиста. Строгий стиль

от Щучкина Сергея


Previous Entry в избранное рассказать другу Next Entry
Как красиво передать массив PHP в JS. JSON
сергей щучкин
[info]shuchkin
Универсальный набор JSON функций

Вам нужна только ajax( $data ) и ajaxencode($data);

1) AJAX. Самое обычное применение:

используется http://code.google.com/p/transajax

<?php
$users_array = array("Sergey", "Andrey", "Irina");

if ( isset($_GET['is_ajax'])) ajax( $users_array );

?>
...ну и где-то в коде страницы
<script>
function get_users() {
  ajax("?is_ajax=true", _get_users);
}
function _get_users( r ) {
   alert( r[0] );
}
</script>


2) PHP to JavaScript encoding. Кодирование PHP типов данных в JavaScript
* Ассоциативные массивы представляются как объекты JS

<?php
$users_array = array("Sergey", "Andrey", "Irina");
?>
<script>
var users = <?php echo ajaxencode( $users_array); ?>";
alert(users[0]);
</script>

Ну а вот собственно сами функции

// AJAX output by Sergey Shuchkin, sibvision.ru
function ajax($data, $die = true) {
    if (is_array($data) || is_object($data)) {
        $data = ajaxencode($data);
    }
    header('Content-Type: text/html; charset=utf-8');
   if ($die) die($data) else return $data;
}
function ajaxencode($data) {
    if (is_object($data)) $data = get_object_vars($data);
    $out = array();
    $keys = array();
    if (is_array($data)) $keys = array_keys($data);
    $numeric = true;
    if (!empty($keys)) $numeric = (array_values($keys) === array_keys(array_values($keys)));

    foreach ($data as $key => $val) {
        if (is_array($val) || is_object($val)) {
            $val = ajaxencode($val);
        } else {
            if (is_numeric($val)) {
                $val = $val;
            } elseif (is_bool($val)) {
                $val = ($val) ? 'true' : 'false';
            } elseif (is_null($val)) {
                $val = 'null';
            } else {
                $val = '"' . ajaxescape($val) . '"';
            }
        }
        if (!$numeric) {
            $val = '"' . $key . '"' . ':' . $val;
        }
        $out[] = $val;
    }
    if (!$numeric) {
        $rt = '{' . join(', ', $out) . '}';
    } else {
        $rt = '[' . join(', ', $out) . ']';
    }
    return $rt;
}
function ajaxescape($string) {
    // Escape these characters with a backslash:
    // " \ / \n \r \t \b \f
    $search  = array('\\', "\n", "\t", "\r", "\b", "\f", '"');
    $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"');
    $string  = str_replace($search, $replace, $string);

    // Escape certain ASCII characters:
    // 0x08 => \b
    // 0x0c => \f
    $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string);

    return $string;
}
Метки: , , ,

Home