【问题标题】:json_encode returns column name and array indexjson_encode 返回列名和数组索引
【发布时间】:2017-09-09 10:55:55
【问题描述】:

我的代码有一个小问题。我想要做的是将选择的结果显示为 json。我就是这样做的:

foreach ($query as $row) {
    $test = json_encode($row);
}

但它返回:

{0: "34.8", 1: "1441098255", 2: "1", col1: "34.8", col2: "1441098255", col3: "1"}

我想要这样:

{0: "34.8", 1: "1441098255", 2: "1"}

或者这个:

{col1: "34.8", col2: "1441098255", col3: "1"}

我尝试过what they say here,但无济于事。

编辑:这些回复很有帮助,他们做我想做的事。现在的问题是我有一些鬼鬼祟祟的部分,由于某种原因似乎无法摆脱。这是生成的 json 字符串:

{"col1":"34.8","0":"34.8","col2":"1441098255","col3":"1"}

那个 "0":"34.8" 似乎不想离开,我完全不知道它是从哪里来的,如果我改变列顺序,它总是会复制先出现的列。如果我将“col3”作为第一个,它会显示:

{"col3":"1","0":"1","col2":"1441098255","col1":"34.8"}

Edit2: 结果发现解决方案比我尝试的要简单得多。以下是如何正确显示它:

while ($arr = $query->fetch(PDO::FETCH_ASSOC)) {
    echo json_encode($arr);
}

【问题讨论】:

  • 您可以轻松地在循环中为所需的输出构建正确的格式,然后在循环输出 json 中的数组
  • @Gert 你介意解释一下怎么做吗?
  • 看起来您的数据库结果由数字 ID 和列名索引 - 您应该能够在获取结果时指定您想要的结果(在对 PDOStatement::fetch 或类似的调用中)。不过,您还没有包含数据库代码,因此无法准确说出您需要更改的内容。
  • @iainn 你的意思是选择?我使用$query = $this->dbh->prepare(select stuff...),后跟$query->execute();
  • 什么是用于例如移动应用程序连接到数据库的 json 数据? @Newwt

标签: php json


【解决方案1】:
 $data=array();
foreach ($query as $row) {

   $data[]=$row;
   //$test = json_encode($row);
}

$test = json_encode( $data);

【讨论】:

  • 考虑为你解答解释
【解决方案2】:

array_filterARRAY_FILTER_USE_KEY 标志一起使用

$keys = ["col1", "col2", "col3"];
foreach ($query as $row) {
    $filtered = array_filter((Array) $row, function($key) use($keys) {
        return in_array($key, $keys);
    }, ARRAY_FILTER_USE_KEY);
    $test = json_encode($filtered);
}

注意:如果您的 $row 是数组而不是对象,则无需将其强制转换为数组 (Array) $row

【讨论】:

  • 我收到Call to undefined function array_fiter()
  • @Newwt 它的字面错误应该是过滤器
  • 天哪,我都没注意到哈哈!它完全符合我的要求,谢谢!
  • @Newwt 我猜来自不同的地方,因为$query = [["col1"=>"x",1=>"y"]]; 返回已过滤
  • 老实说,您应该遵循@iainn 的想法,您如何在数组中同时获得数字键和关联键?
【解决方案3】:

你可以使用array_chunk来获取$row的前三个元素。

json_encode(array_chunk($row, 3, true)[0]);

【讨论】:

  • 为什么不array_slice($row, 0, 3)
  • 这会返回一些奇怪的 json:{"col1":"34.8","0":"34.8","col2":"1441098255"}。编辑:我只是注意到它与我标记为“已解决”的答案相同。嗯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2014-10-12
相关资源
最近更新 更多