JSON在php中具有多个数组的顺序,其中对象数量不同

时间:2018-11-27 02:00:12

标签: php arrays json

我以前从不需要json,所以经验几乎为零...

我正在使用以下代码将多个数组输出到json文件中:

$file= 'myfile.json';

$contents = array('name' => $name,'busname' => $busname,'busdesc' => $busdesc, etc, etc);
    $newcont=json_encode($contents, JSON_PRETTY_PRINT);
    print_r($newcont);
    file_put_contents($file, $newcont);

这按预期工作,并且输出使我类似于以下内容:

"name": [
    "joe blogs",
    "random name 2",
    "random name 3",
    etc,
    etc
],
"busname": [

    "ABC business",
    "DEF business",
    "HIJ business",
    etc,
    etc
],
"busdesc": [
    "We do stuff",
    "We do other stuff",
    "We don't do anything",
    etc,
    etc
],

是否可以(使用一种简单的方法)使输出更像:

"id1": [  "joe blogs", "ABC business", "We do stuff", etc ]
"id2":  [   "random name 2", "DEF business", "We do other stuff", etc ]
"id3":  [   "random name 3", "HIJ business", "We don't do anything", etc ]
etc

布局并不是特别重要,但是将它们组合在一起是很重要的。

从Google搜索获得相关结果的努力很少。

我之所以要求一种简单的方法,是因为我确定我可以提出一些幻想式的循环,该循环首先计算条目的数量,然后循环以继续添加相关数据-这很可能就是答案,但我只是想知道。

非常感谢


编辑:

我未删除此消息,因为我的修复尝试没有用。

代码如下:

$results = mysqli_query($con,"SELECT * FROM membersites  WHERE id>0 ORDER BY id, busname");
$totalmem = mysqli_num_rows($results);
while($business = mysqli_fetch_array($results))
{
    $r1 = $business['id'];
    $id[]=$r1;
    $r2 = $business['name'];
    $name[]=$r2;
    $r4 = $business['busname'];
    $busname[]=$r4;
    $r5 = $business['busdesc'];
    $busdesc[]=$r5; 

    $all[] = "'id:''".$r1."''name:''".$r2."''busname:''".$r4."''busdesc:''".$r5."'";
}

$contents = array('members' => $all);
$newcont=json_encode($contents, JSON_PRETTY_PRINT);
print_r($newcont);

这几乎可以正常工作,因为所有数据都正确地分组了,但是我只有一个对象(成员),内部所有用户,而不是每个用户的单个对象。

同样,请记住,这是我必须输出任何json文件的第一个项目。

任何帮助将不胜感激:)


编辑2(为清楚起见)

最终输出应如下图所示

{
    [
        {
            "id":"1",
            "name":"joe blogs",
            "busname":"ABC business",
            "busdesc":"We do stuff"
        },
        {
            "id":"2",
            "name":"joe blogs",
            "busname":"random name 2",
            "busdesc":"We do other stuff"
        },
        etc
    ]
}

该文件将由移动应用读取-应用开发者刚刚告诉我,该文件必须采用这种格式。

很尴尬的道歉。

2 个答案:

答案 0 :(得分:2)

当您从数据库循环记录时,构建一个多维数组:

while($business = mysqli_fetch_array($results))
{
    $all[] = [
        'id' => $business['id'],
        'name' => $business['name'],
        'busname' => $business['busname'],
        'busdesc' => $business['busdesc'],
    ];
    // or 
    $all[] = $business;
    // or 
    $all[ $business['id'] ] = $business;
}

然后您可以像这样将多维数组编码为JSON:

$newcont = json_encode($all, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);

添加JSON_FORCE_OBJECT将保留数字键(即,当您使用$all[]添加时)

答案 1 :(得分:1)

我建议使用PDO代替mysqli进行数据库访问,而mysqli最初是作为旧mysql扩展的临时替代品而开发的。但是,使用mysqli应该可以:

$result = $con->query("SELECT id, name, busname, busdesc FROM membersites WHERE id > 0 ORDER BY id, busname");
$data = $result->fetch_all();
$json = json_encode($data, JSON_PRETTY_PRINT);
file_put_contents($file, $json);

您应尽可能避免使用SELECT *。它减少了开销,并确保您知道要接收的列的顺序。 mysqli_result::fetch_all()函数可一次提取所有记录,因此无需循环。