PHP Array to JSON Array using json_encode();


77

我已经对使用内置json_encode();函数制作的数组进行了编码。我需要像这样的数组数组格式:

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

但是,它返回为:

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

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


您能否向我们展示更多代码,以便我们了解您还在做什么?
吉姆(Jim)

5
["2":["Afghanistan",32,12],"4":["Albania",32,12]]甚至不是有效的JSON,因此我怀疑您是否明白这一点。如果您的顶级数组是关联数组,则只需调用array_values()即可获取连续的索引元素。
菲利克斯·克林

Answers:


167

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

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

例:

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

1
当我发现当json_encode在由array_filter过滤后该数组中只有一项时,我没有发现明显的原因将json_encode转换为对象时,到此结束。我不知道数组索引是否与这个令人讨厌的php“ bug”有关,但是array_values为我解决了它。从现在开始..没有array_values被调用的数组的json_encode。
Mar Bar

@MarBar如果数组具有非数字字符串键或数字键乱序json_encode()将产生一个{}对象而不是一个数组,[]因为JavaScript / JSON没有其他方法可以表示这种结构。但是,是的,array_keys()如果结果json字符串中不需要键,则可以剥离它们。
Michael Berkowski

@MichaelBerkowski:我从数据库表中得到一个复合主键,这也是我需要做的同样的问题:mysqli_fetch_assoc然后array_values...我想知道这是否是最有效的获取大量真实数组的方法数据...我应该重写我的习惯json_encode吗?您对此有何评价?
去封闭

1
@deblocker很难猜测小时复合键是否适合。通常,PHP的array_*()功能都非常高效。在小型数组上,如果可以避免循环,通常我倾向于使用一些单个动作array_ *函数。但是,如果mysqli_result很大,则可能不希望一次将其全部编译成一个数组,然后调用array_values()。取而代之的是,您最好在提取时将行追加到数组中。不过所有猜测都是因为我不知道您的代码是什么样子。
Michael Berkowski

1
@Gem在很大程度上取决于您需要创建的XML结构,因为XML元素必须以某种方式命名。在stackoverflow.com/questions/1397036/中
Michael Berkowski

18

json_encode()函数将帮助您在php中将数组编码为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"} 
?>

1
谢谢,JSON_FORCE_OBJECT提供了很大帮助
Uriahs Victor

6

我想补充一下迈克尔·伯科夫斯基(Michael Berkowski)的答案,即如果将数组的顺序颠倒,也会发生这种情况,在这种情况下,观察问题会有些棘手,因为在json对象中,顺序将按升序排列。

例如:

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

将返回:

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

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


我认为array_values@Michael Berkowski编写的解决方案更为通用,并且在您的情况下也适用。
Jacopo Pace

0

如果未在初始数组上指定索引,则将获得常规的数字索引。数组必须具有某种形式的唯一索引


0

JSON的常见用法是从Web服务器读取数据,然后在Web页面中显示数据。

本章将教您如何在客户端和PHP服务器之间交换JSON数据。

PHP具有一些内置函数来处理JSON。

可以使用PHP函数json_encode()将PHP中的对象转换为JSON:

<?php
$myObj->name = "John";
$myObj->age = 30;
$myObj->city = "New York";

$myJSON = json_encode($myObj);

echo $myJSON;
?>


0

将PHP数组转换为JSON时,重音符号出现问题。我把UTF-8放在各处,但是没有什么能解决我的问题,直到我在推送数组的PHP while循环中添加了这段代码:

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

只是“ $ word”变量引起了问题。之后,它做了一个jason_encode没问题。

希望能有所帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.