массив json_encode возвращает строку без индекса

#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 завершается неудачно. В нем используется джут