PHP json_encode JSON_NUMERIC_CHECK с 5808e70581507

#json

#json

Вопрос:

Привет, я испытываю некоторые трудности с функцией json_encode в PHP. У меня есть объект с хэшем (uniq ID), но он может иметь этот формат 5808e70581507, и из-за «e», окруженного числами, я думаю, что json_encode пытается установить этого парня как целое число.

Мой объект выглядит следующим образом :

     stdClass Object
(
    [id] => 16
    [title] => userinf2
    [desc] => Travail →
    [startoff] => 2016-10-20 05:00:00
    [stop] => 2016-10-20 13:00:00
    [status] => 1
    [allDay] => 0
    [code_mode] => M
    [uid] => 31250
    [gid] => 502935
    [recurrence_id] => 
    [recurrence_mode] => 
    [recurrence_repeat_every] => 
    [recurrence_repeat_day] => 
    [recurrence_end_mode] => 
    [recurrence_end_date] => 
    [recurrence_end_number] => 
    [multiple_timeschedule_id] => 5808e70581507
    [start] => 2016-10-20 05:00:00
    [end] => 2016-10-20 13:00:00
    [color] => #7AE7BF
    [className] => working uid_31250 code_mode_M gid_502935
)
  

Есть ли способ заставить это работать как есть?

Код :

   echo json_encode($events[6], JSON_NUMERIC_CHECK); 

  var_dump($events[6]->multiple_timeschedule_id); // string(13)
  

Код назначения :

     function _oms_planning_planning_get()
{
    try {

        global $user;
        $intervenants = _oms_planning_get_cab_intervenants();
        $sql = 'SELECT * FROM planning_event WHERE 1=1 AND (';
        $params_sql = array();
        foreach ($intervenants as $key => $a_user) {
            $sql .= ' uid =:uid' . $key . ' OR ';
            $params_sql[':uid' . $key] = $a_user->uid;
        }
        $sql = substr($sql, 0, -3);
        $sql .= ')';

        $result = db_query($sql, $params_sql);

        $db_events = $result->fetchAll();
        $events = array_map(function ($db_event) use ($intervenants) {
            $db_event->start = $db_event->startoff;
            $db_event->end = $db_event->stop;
            $db_event->color = (isset($db_event->gid) amp;amp; intval($db_event->gid) > 0) ?
                _oms_planning_planning_get_color_from_gid($db_event->gid) :
                _oms_planning_planning_get_color_from_uid($intervenants, $db_event->uid);
            $db_event->className = ($db_event->status == 1) ? 'working ' : 'idleness ';
            $db_event->className .= 'uid_' . $db_event->uid . ' ';
            $db_event->className .= 'code_mode_' . $db_event->code_mode . ' ';
            $db_event->className .= 'gid_' . $db_event->gid;
            return $db_event;
        }, $db_events);

        return $events;
    } catch (Exception $e) {
        print_r($e);
    }
}
  

Тип столбца Mysql: multiple_timeschedule_id varchar(200) utf8_general_ci

Комментарии:

1. Ну, вопрос в том, какой внутренний тип данных фактически используется перед вызовом json_encode() . PHP — это слабо типизированный язык, да, но это не означает, что у него нет внутренних типов. Итак, является ли $obj-> multiple_timeschedule_id строковым или числовым типом?

2. Не могли бы вы опубликовать код с присвоением? PHP не переключает типы автоматически из-за вызова json_encode() . Для этого должна быть какая-то причина.

3. Эм, ты понимаешь , что это JSON_NUMERIC_CHECK явно указывает функции json_encode() кодировать числовые строки как числа?

4. Хорошо, итак, проблема в том, что вы явно указываете ему преобразовать числа, но затем хотите исключение. Это, очевидно, то, о чем PHP не может догадаться.

5. Вы должны убедиться, что ваши типы являются правильными типами в PHP перед json_encode вводом ваших данных. Нет необходимости делать это в Javascript постфактум, и нет причин полагаться на общий автомат, подобный, JSON_NUMERIC_CHECK который, очевидно, может ошибиться. Если вы получаете данные из базы данных в виде строк, либо переключите свой адаптер базы данных на корректное приведение значений, либо сделайте это вручную / через ORM.