【问题标题】:PHP Array to JSON Array using json_encode(); [duplicate]使用 json_encode() 的 PHP 数组到 JSON 数组; [复制]
【发布时间】:2012-07-28 03:41:49
【问题描述】:

我已经使用内置的json_encode(); 函数对我制作的数组进行了编码。我需要它的数组格式,如下所示:

[["Afghanistan",32,12],["Albania",32,12]]

但是,它返回为:

{"2":["Afghanistan",32,12],"4":["Albania",32,12]}

如何在不使用任何正则表达式技巧的情况下删除这些行号?

【问题讨论】:

  • ["2":["Afghanistan",32,12],"4":["Albania",32,12]] 甚至不是有效的 JSON,所以我怀疑你明白了。如果您的顶级数组是关联数组,只需调用 array_values() 以获取连续的索引元素。
  • 对这个话题也很感兴趣:php.net/manual/en/function.json-encode.php#105923
  • @Ben 链接似乎不再起作用
  • @8ctopus 是的,我猜它已经 9 岁了..

标签: php arrays json


【解决方案1】:

如果您的 PHP 数组中的数组键不是连续的数字,json_encode() 必须将另一个构造成一个对象,因为 JavaScript 数组总是以连续的数字索引。

在 PHP 的外部结构上使用array_values() 来丢弃原来的数组键,并用从零开始的连续编号代替:

示例:

// Non-consecutive 3number keys are OK for PHP
// but not for a JavaScript array
$array = array(
  2 => array("Afghanistan", 32, 13),
  4 => array("Albania", 32, 12)
);

// array_values() removes the original keys and replaces
// with plain consecutive numbers
$out = array_values($array);
json_encode($out);
// [["Afghanistan", 32, 13], ["Albania", 32, 12]]

【讨论】:

  • 当我发现 json_encode 将数组转换为对象时,当数组在被 array_filter 过滤后只有一个项目时,我已经到此结束了。我不知道数组索引是否与这个令人作呕的 php“错误”有关,但 array_values 为我整理了它。从现在开始.. 没有 array_values 的数组没有 json_encode 被调用。
  • @MarBar 如果数组有一个非数字字符串键或一个数字键乱序json_encode()将产生一个{}对象而不是一个数组@ 987654328@ 因为 JavaScript/JSON 没有其他方法来表示这种结构。但是,是的,如果生成的 json 字符串中不需要它们,您可以使用 array_keys() 剥离键。
  • @MichaelBerkowski:我在数据库表中的复合主键遇到了同样的问题,我需要先做:mysqli_fetch_assoc,然后是array_values...我很好奇如果这是获得具有大量数据的真正数组的最高效方式...我应该重写我的自定义json_encode 吗?您对此有何(赞赏)意见?
  • @deblocker 很难猜测小时复合键是否适合。通常 PHP 的 array_*() 函数都非常有效。在一个小数组上,如果可以避免循环,我通常更喜欢使用一些单动作 array_* 函数。但是,如果您的 mysqli_result 很大,您可能不想一次将其全部编译到一个数组中,然后调用array_values()。相反,您最好在获取时将行附加到数组中。所有的猜测都是因为我不知道你的代码是什么样的。
  • @Gem 这在很大程度上取决于您需要创建的 XML 的结构,因为必须以某种方式命名 XML 元素。 stackoverflow.com/questions/1397036/…中有例子
【解决方案2】:

我想在 Michael Berkowski 的回答中补充一点,如果数组的顺序颠倒了,也会发生这种情况,在这种情况下,观察问题有点棘手,因为在 json 对象中,顺序将按升序排列。

例如:

[
    3 => 'a',
    2 => 'b',
    1 => 'c',
    0 => 'd'
]

将返回:

{
    0: 'd',
    1: 'c',
    2: 'b',
    3: 'a'
}

所以在这种情况下的解决方案是在将其编码为 json 之前使用array_reverse

【讨论】:

  • 我认为@Michael Berkowski 编写的array_values 解决方案更通用,它也适用于您的情况。
  • @mickmackusa 我不同意它应该被删除。虽然它可能对 OP 没有用,但它对其他有类似问题的人仍然有用。
  • 这是很久以前的事了。我记得我只是想回答另一个可能不明显的案例,如果有人有类似的问题,并且会滚动浏览,这会给他们一个提示。我不认为这有什么坏处。确实,有人可能会盲目地遵循@Michael Berkowski 的解决方案,但如果您已经认为这不是您的问题,或者试图理解为什么这是您的问题,那么这可能就是...
  • 每个答案只能针对问题范围内的问题。通过更改示例数据来扩展问题并不好——否则我们会看到大量页面遭受范围蔓延的影响。这里有数百万页,找到更合适的页面来发布此建议。 array_reverse() 对 OP 的问题绝对没有好处。
  • 帖子的年龄不是这个决定的一个因素。研究人员不在乎页面/帖子的年龄。他们想要针对给定问题的最佳建议,而不是浪费时间阅读离题/不相关的内容。
【解决方案3】:

json_encode() 函数将帮助您在 php 中将 array 编码为 JSON

如果您直接使用 json_encode 函数而不使用任何特定选项,它将返回一个数组。 就像上面提到的问题

$array = array(
  2 => array("Afghanistan",32,13),
  4 => array("Albania",32,12)
);
$out = array_values($array);
json_encode($out);
// [["Afghanistan",32,13],["Albania",32,12]]

由于您正在尝试将 Array 转换为 JSON,那么我建议在 json_encode 中使用 JSON_FORCE_OBJECT 作为附加选项(参数),如下所示

<?php
$array=['apple','orange','banana','strawberry'];
echo json_encode($array, JSON_FORCE_OBJECT);
// {"0":"apple","1":"orange","2":"banana","3":"strawberry"} 
?>

【讨论】:

    【解决方案4】:

    在将 PHP 数组转换为 JSON 时,我遇到了重音字符的问题。我把 UTF-8 的东西到处都是,但没有解决我的问题,直到我在我的 PHP while 循环中添加了这段代码,我正在推送数组:

    $es_words[] = array(utf8_encode("$word"),"$alpha","$audio");
    

    只有“$word”变量有问题。之后它做了一个 jason_encode 没问题。

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-21
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      相关资源
      最近更新 更多