#php #arrays #json #user-interface
Вопрос:
Я создаю простой графический интерфейс для своего исполняемого файла Linux. Я просто использую HTML/Javascript и PHP. Моя проблема в том, что я вызываю свой вызываемый system
объект со строкой json в качестве параметра, у моей строки нет индекса в массиве. Вот мой код
$b = [0=>[1,2,3],1=>[4,5,6]];
var_dump(json_encode($b,JSON_NUMERIC_CHECK));
string(17) "[[1,2,3],[4,5,6]]"
Мне нужна строка с ключом, потому что код c/c требует индекса, почему это происходит? Как это решить? Спасибо
Ответ №1:
JSON на самом деле является строковым Javascript, и если вы хотите представить структуры ключей => значений, эти структуры должны быть объектами или ассоциативными массивами. PHP примет любой ассоциативный массив, содержащий только числа, в качестве ключей к обычному массиву, поэтому вы должны привести свой массив к объекту. Объекты не могут иметь числа в качестве ключей (свойств), поэтому они будут преобразованы в строки, так что на самом деле у вас будет '0' => [1,2,3]
… и так далее.
Самый простой способ-просто привести свой массив к объекту. Посмотрите на пример ниже:
<?php
$array = [0=>[1,2,3],1=>[4,5,6]];
$object = (object) $array;
print json_encode($array);
print json_encode($object);
?>
Выход:
[[1,2,3],[4,5,6]]{"0":[1,2,3],"1":[4,5,6]}
Дополнение:
При декодировании JSON вы можете выполнить обратное приведение, т. е. в массив:
<?php
$arr = (array)json_decode('{"0":[1,2,3],"1":[4,5,6]}');
var_dump($arr);
$obj = json_decode('{"0":[1,2,3],"1":[4,5,6]}');
var_dump($obj);
?>
Выход:
array(2) {
[0]=>
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
[1]=>
array(3) {
[0]=>
int(4)
[1]=>
int(5)
[2]=>
int(6)
}
}
object(stdClass)#1 (2) {
["0"]=>
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
["1"]=>
array(3) {
[0]=>
int(4)
[1]=>
int(5)
[2]=>
int(6)
}
}
Комментарии:
1. Хорошо, спасибо. Я решил установить 0 как *. В c atoi преобразовал бы его в 0
2. вы можете использовать противоположное приведение при декодировании результата, т. е.
$array = (array)json_decode('{"0":[1,2,3],"1":[4,5,6]}');
3. Я сделал небольшое дополнение к ответу, чтобы показать, как это сделать и в чем разница.
Ответ №2:
Вы можете принудительно вводить цифровые клавиши с помощью json_encode, используя JSON_FORCE_OBJECT
флаг :
var_dump(json_encode($b,JSON_NUMERIC_CHECK|JSON_FORCE_OBJECT));
Комментарии:
1. хорошо, это работает…теперь у этой строки есть индекс. Но исполняемый файл не работает 🙁
2. Можете ли вы предоставить нам код, чтобы мы могли взглянуть ?
3. в любом случае, это очень долго, проблема в том, что есть. Возможно, синтаксический анализ c/c json завершается неудачно. В нем используется джут