PHP - Json解码为关联数组与编号

时间:2015-03-12 20:11:06

标签: php arrays json

我有JSON:

"{"description":"Testing","site":"http:\/\/localhost","steps":{"step":[{"command":"grabimage","parameter":"img[alt=\"Next\"]"},{"command":"click","parameter":"img[alt=\"Previous\"]"}]}}"

由SimpleXML从XML文件生成动态:

<?xml version="1.0"?>
<pullcase>
<description>Testing</description>
<site>http://localhost:81</site>
<steps>
<step>
   <command>grabimage</command>
   <parameter>img[alt="Next"]</parameter>
</step>
</steps>
</pullcase>

它包含一个可能无限数量的&#34;步骤&#34;在&#34;步骤&#34;。当只有一个步骤时,数组生成为:

["steps"]=>
array(1) {
["step"]=>
array(2) {
  ["command"]=>
  string(9) "grabimage"
  ["parameter"]=>
  string(15) "img[alt="Next"]"
}
}

当有多个步骤时,它会生成为:

["steps"]=>
array(1) {
["step"]=>
array(2) {
  [0]=>
  array(2) {
    ["command"]=>
    string(9) "grabimage"
    ["parameter"]=>
    string(15) "img[alt="Next"]"
  }
  [1]=>
  array(2) {
    ["command"]=>
    string(5) "click"
    ["parameter"]=>
    string(19) "img[alt="Previous"]"
  }
  }
}

如何让为一个子元素生成的数组遵循与多个子元素相同的规则?

["steps"]=>
array(1) {
["step"]=>
array(1) {
  [0]=>
  array(2) {
  ["command"]=>
  string(9) "grabimage"
  ["parameter"]=>
  string(15) "img[alt="Next"]"
}
}

2 个答案:

答案 0 :(得分:0)

json_decode()不应该受到责备。 JSON结构定义它是一个数组还是仅一个元素。

这是一个精简的例子。它避免使用JSON_OBJECT_AS_ARRAY,因此对象被解码为stdClass实例,并且阵列更容易被发现。

$json = <<<'JSON'
{
  "key": {
    "list_example": [
      {
        "key": "value"
      }
    ]
  }
}
JSON;

var_dump(json_decode($json));

输出:

object(stdClass)#1 (1) {
  ["key"]=>
  object(stdClass)#2 (1) {
    ["list_example"]=>
    array(1) {
      [0]=>
      object(stdClass)#3 (1) {
        ["key"]=>
        string(5) "value"
      }
    }
  }
}

您可以看到list_example包含数组。

问题在于生成JSON的源代码。 XML to JSON映射器将是典型的候选者。

答案 1 :(得分:0)

您只需要将单个子数组数组覆盖为包含“本身”的索引数组。

代码(Demo

$json='{"description":"Testing","site":"http:\\/\\/localhost","steps":{"step":{"command":"grabimage","parameter":"img[alt=\\"1Next\\"]"}}}';
$array=json_decode($json,true);
if(key($array['steps']['step'])==='command'){  // if first key is "command" it is not indexed (in other words, "lone")
    $array['steps']['step']=[$array['steps']['step']];  // position the lone subarray (deeper) in an indexed subarray.
}
var_export($array);

输出:

array (
  'description' => 'Testing',
  'site' => 'http://localhost',
  'steps' => 
  array (
    'step' => 
    array (
      0 => 
      array (
        'command' => 'grabimage',
        'parameter' => 'img[alt="1Next"]',
      ),
    ),
  ),
)