【问题标题】:Create nested hashes from an array of elements for JSON encoding从元素数组创建嵌套散列以进行 JSON 编码
【发布时间】:2014-08-13 00:02:50
【问题描述】:

我已经生产了一系列存放在某个地方的水果。说它看起来像这样

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

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

如何获得我想要的输出?

【问题讨论】:

    标签: php arrays json


    【解决方案1】:

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

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

    【讨论】:

    • 如果我想用count 对扩展每个水果哈希(例如:{"name:banana", "count: 1"}),这种方法似乎不起作用。这就是为什么我最初想拥有那个额外的数组。
    • 当然可以。只需改用array("name" => $key, "count" => $someCount)
    • 哦,那么在这种情况下,创建一个新数组并先填充它与内联创建一个新数组有什么区别?
    • 因为你在做both。您正在创建一个空数组,然后将您的名称/值对数组放入其中。
    • 你说得对,现在我再看一遍,我以为键值对是这样添加的,显然不是这样!
    【解决方案2】:

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

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

    *根据您的评论编辑

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2019-08-19
      • 2014-02-02
      相关资源
      最近更新 更多