从JSON编码的元素数组中创建嵌套散列


Create nested hashes from an array of elements for JSON encoding

我已经生成了一个存储在某处的水果数组。比如它看起来像这样

$myFruits = array("apples"=>1, "oranges"=>3, "bananas"=>5);

这个数组然后被传递给一个函数,该函数将为API返回json编码的数据。

首先,我希望能够返回一个包含所有水果类型的列表

{"fruits":["apples", "oranges", "bananas"]}

我用这个来完成它

echo json_encode(array("scripts" => array_keys($scripts)));

现在,我希望每种类型的水果都包含在自己的哈希中,如

{"fruits":
  [
    {name: "apples"
    },
    {name: "oranges"
    },
    {name: "bananas"
  ]
}

这样,我可以添加额外的字段到每个水果对象,而不会破坏现有的代码,可能使用此API的以前版本(例如:如果我决定添加水果计数在那里,以及)。

看到我如何创建一个新的数组,并将我的水果列表分配给一个名为"fruits"的键,我尝试对每个内部哈希做同样的事情:

$myFruits = array("apples"=>1, "oranges"=>3, "bananas"=>5);
$data = array();
foreach ($myFruits as $key => $value) {
  // initialize an associative array for each fruit
  $val = array();
  array_push($val, array("name" => $key));
  // add it to the list of fruits
  array_push($data, $val);
}
// assign list of fruits to "fruits" key
$outData = array("fruits" => $data);
echo json_encode($outData);

但是我得到了这个

{"fruits":[[{"name":"apples"}],[{"name":"oranges"}],[{"name":"bananas"}]]}

在每个水果散列周围有额外的方括号,我认为这是因为我使用了一个数组来存储每个键值对。

我如何得到我想要的输出?

你马上就知道你做错了什么了。您正在创建一个数组,然后使用它向其中添加一个项目(另一个数组)。

// initialize an associative array for each fruit
$val = array(); // this guy here is unnecessary!!
array_push($val, array("name" => $key));
// add it to the list of fruits
array_push($data, $val);

相反,只需将每个单独的数组直接压入$data,就像这样:

array_push($data, array("name" => $key));
演示

在数组中创建一个额外的级别,只需在每次迭代中将一个新数组推入$data:

foreach ($myFruits as $key => $value) {
  $data[]=array("name" => $key, "count" => $value);
}

*按您的评论编辑