#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.