За последние 24 часа нас посетили 18425 программистов и 1636 роботов. Сейчас ищут 1229 программистов ...

PHP массив в JSON формат

Тема в разделе "JavaScript и AJAX", создана пользователем Psih, 16 май 2008.

  1. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Сегодня наваял вот такое:
    PHP:
    1. <?php
    2. class JSONHelper {
    3.  
    4.     var $match = array('"', '\\', '/', "\n", "\r");
    5.     var $replace = array('\"', '\\\\', '\/', '\\n', '\\r');
    6.    
    7.     /**
    8.      * Parse structure to JSON
    9.      *
    10.      * @param mixed $data
    11.      * @return string
    12.      */
    13.     function parse($data) {
    14.         return '{'.$this->encode($data).'}';
    15.     }
    16.    
    17.     /**
    18.      * Converts PHP variable to JSON string
    19.      * Can convert any PHP variable with any content to correct JSON structure
    20.      *
    21.      * @param mixed $data Data to convert
    22.      * @return string
    23.      */
    24.     function encode($data) {
    25.        
    26.         $type = $this->getType($data);
    27.        
    28.         switch ($type) {
    29.             case 'object':
    30.                 $data = '{'.$this->processData($data, $type).'}';
    31.                 break;
    32.             case 'array':
    33.                 $data = '['.$this->processData($data, $type).']';  
    34.                 break;
    35.             case 'number':
    36.                 $data = $data;
    37.                 break;
    38.             case 'string':
    39.                 $data = '"'.$this->escape($data).'"';
    40.                 break;
    41.             case 'boolean':
    42.                 $data = ($data) ? 'true' : 'false';
    43.                 break;
    44.             case 'null':
    45.                 $data = 'null';
    46.                 break;
    47.         }
    48.         return $data;
    49.     }
    50.     //-----------------------------------------------------------------------------
    51.  
    52.    
    53.     /**
    54.      * Enter description here...
    55.      *
    56.      * @param unknown_type $input
    57.      * @param unknown_type $type
    58.      * @return unknown
    59.      */
    60.     function processData($data, $type) {
    61.        
    62.         // If data is an object - it should be converted as a key => value pair
    63.         if ($type == 'object' || $type == 'array'){
    64.             $output = Array();
    65.             foreach($data as $key => $value) {         
    66.                 $output[] = '"'.$key.'": '.$this->encode($value);
    67.             }
    68.             $output = implode(',', $output);
    69.         } else {
    70.             $output = null;
    71.             foreach($data as $key => $value) {
    72.                 $output .= $this->encode($value);
    73.             }
    74.         }
    75.         return $output;
    76.     }
    77.     //-----------------------------------------------------------------------------
    78.    
    79.    
    80.     /**
    81.      * Function determines type of variable
    82.      *
    83.      * @param unknown_type $data
    84.      * @return unknown
    85.      */
    86.     function getType(&$data){
    87.        
    88.         if (is_object($data)) {
    89.             $type = 'object';
    90.         } elseif (is_array($data)) {
    91.             // If array is assoc it should be processed as an object
    92.             if($this->is_assoc($data)) {
    93.                 $type = 'object';
    94.             } else {
    95.                 $type = 'array';
    96.             }
    97.         } elseif (is_numeric($data)) {
    98.             $type = 'number';
    99.         } elseif(is_string($data)) {
    100.             $type = 'string';
    101.         } elseif(is_bool($data)) {
    102.             $type = 'boolean';
    103.         } elseif(is_null($data)) {
    104.             $type = 'null';
    105.         } else {
    106.             $type = 'string';
    107.         }
    108.         return $type;
    109.     }
    110.     //-----------------------------------------------------------------------------
    111.    
    112.    
    113.     /**
    114.      * Function determines if array is associative
    115.      *
    116.      * @param array $array
    117.      * @return bool
    118.      * @
    119.      */
    120.     function is_assoc($array) {
    121.         // We do that by sorting array keys in reverse (numbers go before other symbols)
    122.         // and probing first element key. 99.9% it will be a string key.
    123.         krsort($array, SORT_STRING);
    124.         return !is_numeric(key($array));
    125.     }
    126.     //-----------------------------------------------------------------------------
    127.    
    128.    
    129.     /**
    130.      * Escapes special characters
    131.      * Function escapes ", \, /, \n and \r symbols so that not to cause JavaScript error or
    132.      * data loss
    133.      *
    134.      * @param string $string
    135.      * @return string
    136.      */
    137.     function escape($string) {
    138.         return str_replace($this->match, $this->replace, $string);
    139.     }
    140.     //-----------------------------------------------------------------------------
    141. }
    142. ?>
    Однако есть проблема - покрайней мере Firefox в Firebug ругается "missing ]", хотя вроде всё правильно же.
    Использую вот так:
    PHP:
    1. <?php
    2. $data = Array(
    3.     "103"=> Array(
    4.         "AcademicPlanItemId"=> "103",
    5.         "WeekContactHours"=> "4",
    6.         "IsJointLecture"=> "0",
    7.         "RefStudyId"=> "9",
    8.         "RefStudyTitle"=> "Testing",
    9.         "Staff"=> Array(
    10.             "22"=> Array(
    11.                 "StaffId"=> "22",
    12.                 "StaffName"=> "Sidor Sidorov",
    13.             ),
    14.         ),
    15.     ),
    16.     "100"=> Array(
    17.         "AcademicPlanItemId"=> "100",
    18.         "WeekContactHours"=> "13",
    19.         "IsJointLecture"=> "0",
    20.         "RefStudyId"=> "2",
    21.         "RefStudyTitle"=> "Какая-то фигня",
    22.         "Staff"=> Array(
    23.             "22"=> Array(
    24.                 "StaffId"=> "22",
    25.                 "StaffName"=> "Sidor Sidorov",
    26.             ),
    27.             "3"=> Array(
    28.                 "StaffId"=> "3",
    29.                 "StaffName"=> "Vasilij Pupkin",
    30.             ),
    31.             "23"=> Array(
    32.                 "StaffId"=> "23",
    33.                 "StaffName"=> "Nikolaj Mutkin",
    34.             ),
    35.         ),     
    36.     ),
    37.     "102"=> Array(
    38.         "AcademicPlanItemId"=> "102",
    39.         "WeekContactHours"=> "12",
    40.         "IsJointLecture"=> "0",
    41.         "RefStudyId"=> "1",
    42.         "RefStudyTitle"=> "Дисциплина 1",
    43.         "Staff"=> Array(
    44.             "3"=> Array(
    45.                 "StaffId"=> "3",
    46.                 "StaffName"=> "Vasilij Pupkin",
    47.             ),
    48.         ),
    49.     ),
    50. );
    51. $json = new JSONHelper();
    52. echo $json->parse($data);
    53.  
    Визуально всё ОК, но Firebug ругается и данных и в итоге код
    [js]
    data = eval(req.responceText);
    [/js]
    не выполняется и data остаётся undefined
    Мучался пол дня почти, так и не догнал в чём проблема
     
  2. eduha

    eduha Активный пользователь

    С нами с:
    8 ноя 2006
    Сообщения:
    278
    Симпатии:
    0
    Адрес:
    Караганда
    Насколько я понимаю, массивы выводятся в результате примерно в таком виде:
    Такая форма записи неверна. Надо либо так:
    Код (Text):
    1. "array": [0,1,2]
    Либо, если надо сохранять значения ключей, то вместо квадратных скобок надо все равно использовать фигурные - тогда будет создан хеш (хешем в javascript называется то, что в php зовется ассоциативный массив)
     
  3. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Судя по классу PHP 4 используется, а JSON функции появились в 5 версии.
     
  5. Taris

    Taris Активный пользователь

    С нами с:
    13 май 2008
    Сообщения:
    29
    Симпатии:
    0
    Services_JSON

    Класс работы с JSON данными в PHP < 5.2

    http://codepaste.ru/1018/

    Sergey89, спасибо за удобный сервис.
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Taris, не хочу показаться назойливым :) но специально для таких случаев сделал небольшой сервис (вторая ссылка в подписи).
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Ti
    Тем что PEAR, а у нас собственная модель приложения. На самом деле этот класс делает extend другого базового класса, я просто это опустил.

    P.S. Вместо сериализованного масива выложил нормальный объявленный через Array()