从JSON编码的元素数组创建嵌套哈希

时间:2014-08-12 15:49:15

标签: php arrays json

我已经在某处储存了一系列水果。说它看起来像这样

$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"}]]}

每个水果哈希周围都有额外的方括号,我假设是因为我使用数组来存储每个键值对。

我如何获得所需的输出?

2 个答案:

答案 0 :(得分:3)

你已经知道自己做错了什么。您正在创建一个数组,然后使用它来向其添加一个项目(另一个数组)。

// 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));

DEMO

答案 1 :(得分:1)

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

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

*根据您的评论进行编辑