【问题标题】:Creating a multi level array for json output with php使用php为json输出创建多级数组
【发布时间】:2013-04-14 13:25:46
【问题描述】:

到目前为止,这是我的 php。我首先添加了我的主要信息,然后添加了我与投票给该日期的用户的日期。

$id = $CURUSER["id"];

$eventid = $_GET['eventid'];

$z = SQL_Query_exec("SELECT * FROM cal_events WHERE eventid = '$eventid'");
$rowz = mysql_fetch_array($z);
$y = SQL_Query_exec("SELECT userid FROM cal_votes WHERE eventid = '$eventid'"); 
$y1 = mysql_num_rows($y);
$x = SQL_Query_exec("SELECT userid FROM cal_votes WHERE eventid = '$eventid' AND voted = 'no'");    
$x1 = mysql_num_rows($x);

$data = array();
            $data['eventid'] = $eventid;
            $data['eventname'] = $rowz['eventname'];
            $data['aboutevent'] = $rowz['aboutevent'];
            $data['lefttovote'] =   $x1;
            $data['enddate'] = date("D jS F Y",strtotime($rowz[enddate]));

 $caldates = SQL_Query_exec("SELECT dateid,eventdates FROM cal_dates WHERE eventid = $eventid ORDER BY dateid ASC");
               while($rowcaldates = mysql_fetch_array($caldates)){
                $data['dates'][] =  date("D jS F Y",strtotime($rowcaldates[eventdates])); 


                    $b = SQL_Query_exec("SELECT forename,surname FROM cal_voted left join users on users.id = cal_voted.userid WHERE dateid = $rowcaldates[dateid] ");
                    $c1 = mysql_num_rows($b);
                     while($rowb = mysql_fetch_array($b)){
                        $data['dates']['names'][] = "$rowb[forename] $rowb[surname],";
                            }
            }

echo json_encode($data);

问题是我的 json 是这样返回的

    {"eventid":"23","eventname":"Mums Birthday","aboutevent":"Curry Night Alton 7pm","lefttovote":0,"enddate":"Wed 19th June 2013",
"dates":{"0":"Sat 23rd March 2013","
names":["John ,","Clare ,","Scott ,","Clare ,","Scott ,"],"1":"Sat 30th March 2013"}}

我试图输出这个。这只是一个拼凑的例子,但我相信你会明白的

 {"eventid":"23","eventname":"Mums Birthday","aboutevent":"Curry Night Alton 7pm","lefttovote":0,"enddate":"Wed 19th June 2013",
"dates":{"0":"Sat 23rd March 2013","
    names":["John,","Clare ,","Scott ,"}
"dates":{"1":"Sat 30th March 2013","
    names":["Clare ,","Scott ,"]}}

这样我就可以遍历日期并使用 jquery mobile 将它们回显出来。我可以直接用 php 来做,因为我不需要将它们放入数组中,但是这个数组业务令人费解

更新*

$data = array();
            $data['eventid'] = $eventid;
            $data['eventname'] = $rowz['eventname'];
            $data['aboutevent'] = $rowz['aboutevent'];
            $data['lefttovote'] =   $x1;
            $data['enddate'] = date("D jS F Y",strtotime($rowz[enddate]));

 $caldates = SQL_Query_exec("SELECT dateid,eventdates FROM cal_dates WHERE eventid = $eventid ORDER BY dateid ASC");
               while($rowcaldates = mysql_fetch_array($caldates)){
                $date_data = array();
                $date_data[0] = date("D jS F Y",strtotime($rowcaldates[eventdates])); 


                    $b = SQL_Query_exec("SELECT forename,surname FROM cal_voted left join users on users.id = cal_voted.userid WHERE dateid = $rowcaldates[dateid] ");
                    $c1 = mysql_num_rows($b);
                     while($rowb = mysql_fetch_array($b)){
                        $date_data['names'] = "$rowb[forename] $rowb[surname],";
                        array_push($data,$date_data);
                            }

            }

echo json_encode($data);

输出

{"eventid":"23","eventname":"Mums Birthday","aboutevent":"Curry Night Alton 7pm","lefttovote":0,"enddate":"Wed 19th June 2013","0":{"0":"Sat 23rd March 2013","names":"John ,"},"1":{"0":"Sat 23rd March 2013","names":"Clare ,"},"2":{"0":"Sat 23rd March 2013","names":"Scott ,"},"3":{"0":"Sat 30th March 2013","names":"Clare ,"},"4":{"0":"Sat 30th March 2013","names":"Scott ,"}}

更新工作答案*

 $caldates = SQL_Query_exec("SELECT dateid,eventdates FROM cal_dates WHERE eventid = $eventid ORDER BY dateid ASC");
               while($rowcaldates = mysql_fetch_array($caldates)){
                $date_data = array();
                $date_data[0] = date("D jS F Y",strtotime($rowcaldates[eventdates])); 


                    $b = SQL_Query_exec("SELECT forename,surname FROM cal_voted left join users on users.id = cal_voted.userid WHERE dateid = $rowcaldates[dateid] ");
                    $c1 = mysql_num_rows($b);
                     while($rowb = mysql_fetch_array($b)){

                        $date_data['names'][] = "$rowb[forename] $rowb[surname],"; 

                            }
                        array_push($data,$date_data);   
            }

echo json_encode($data);

【问题讨论】:

  • 您尝试输出的不是有效的 JSON。为什么要输出无效的 JSON?
  • 我只是剪切并粘贴了一个例子。我知道它并不完美,但我认为它可能会给人们一个想法(编辑了我的第一篇文章)
  • 如果正确看到这一点,您尝试输出的内容将解析为密钥dates 被使用两次,当然会覆盖另一个。为什么dates:[{"date":Sat 23rd..","names":".."},{"date":"Sat 30th ..","names":".."}] 不一样?还有一些关于使用mysql_*functions的东西。
  • 用 Juuga 示例更新了我的示例,但还不够

标签: php json multidimensional-array


【解决方案1】:

这行不通,因为您不能对多个 childeNode 使用相同的名称(即dates):

 { "eventid":"23",
   "eventname":"Mums Birthday",
   "aboutevent":"Curry Night Alton 7pm",
   "lefttovote":0,"enddate":"Wed 19th June 2013",
   "dates":{
           "0":"Sat 23rd March 2013",
           "names":["John Hunter,","Clare Kinnear,","Scott Kinnear,"
           },
   "dates":{
           "1":"Sat 30th March 2013",
           "names":["Clare Kinnear,","Scott Kinnear,"]
           }
  }

你应该像这样在一个数组中组合日期:

 { "eventid":"23",
   "eventname":"Mums Birthday",
   "aboutevent":"Curry Night Alton 7pm",
   "lefttovote":0,"enddate":"Wed 19th June 2013",
   "dates":[{
           "date":"Sat 23rd March 2013",
           "names":["John Hunter,","Clare Kinnear,","Scott Kinnear,"]
           },
           {
           "date":"Sat 30th March 2013",
           "names":["Clare Kinnear,","Scott Kinnear,"]
           }]
  }

要实现这一点,您可以这样做:

$n = 0;
$caldates = SQL_Query_exec("SELECT dateid,eventdates FROM cal_dates WHERE eventid = $eventid ORDER BY dateid ASC");
    while($rowcaldates = mysql_fetch_array($caldates)){
        $data->dates[$n]->date =  date("D jS F Y",strtotime($rowcaldates[eventdates])); 
        $b = SQL_Query_exec("SELECT forename,surname FROM cal_voted left join users on users.id = cal_voted.userid WHERE dateid = $rowcaldates[dateid] ");
        $c1 = mysql_num_rows($b);
        while($rowb = mysql_fetch_array($b)){
            $data->dates[$n]->names[] = "$rowb[forename] $rowb[surname],";
        }
        $n++;
    }

echo json_encode($data);

【讨论】:

  • 谢谢你,你的回答也有效,非常感谢你的贡献
【解决方案2】:

在 while 循环中,创建一个名为 $date_data 的数组。将日期存储在 $date_data[0] 中,将名称存储在 $date_data['names'] 中。最后,如果同时,使用 $data['dates][] = $date_date; 将 $date_data 推送到日期信息中;

附带说明,您不应该将 $_GET 变量直接放入查询中。确保您使用准备好的语句,或以某种方式转义值;-)

【讨论】:

  • 我已经用我的关闭但还没有的例子更新了上面的内容,你能快速看一下,看看这是否是你想要的。非常感谢
  • $date_data['names'] = "$rowb[forename] $rowb[surname],";应该是 $date_data['names'][] = "$rowb[forename] $rowb[surname],";和 array_push($data,$date_data);应该在你的 $rowb while 之外(但仍然在 $rowcaldates while 之内)
  • 谢谢 Juuga 我更新了上面的代码,以防其他人需要帮助
猜你喜欢
  • 2018-06-08
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多