【发布时间】:2016-10-19 21:51:03
【问题描述】:
我有一个平面结果集,在 JSON 中看起来像这样:
[{
"LineItemNo": "1",
"SolNo": "SPE8E7-15-T-1379",
"St": "O",
"PartNo": "F13DBX\/SPX35\/4P",
"UnitPrice": "1.890"
}, {
"LineItemNo": "1",
"SolNo": "SPE8E7-15-T-1379",
"St": "O",
"PartNo": "CF13DD\/E\/835",
"UnitPrice": "1.920"
}, {
"LineItemNo": "1",
"SolNo": "SPE8E7-15-T-1379",
"St": "O",
"PartNo": "QT13\/35-4",
"UnitPrice": "1.770"
}, {
"LineItemNo": "2",
"SolNo": "SPE8E7-15-T-4309",
"St": "O",
"PartNo": "F13DBX\/SPX35\/4P",
"UnitPrice": "1.890"
}, {
"LineItemNo": "2",
"SolNo": "SPE8E7-15-T-4309",
"St": "O",
"PartNo": "CF13DD\/E\/835",
"UnitPrice": "1.920"
}, {
"LineItemNo": "2",
"SolNo": "SPE8E7-15-T-4309",
"St": "O",
"PartNo": "QT13\/35-4",
"UnitPrice": "1.770"
}]
我想改成这样:
{
"data": [{
"LineItemNo": "1",
"SolNo": "SPE8E7-15-T-1379",
"St": "O",
"Parts": [{
"PartNo": "F13DBX\/SPX35\/4P",
"UnitPrice": "1.890"
}, {
"PartNo": "CF13DD\/E\/835",
"UnitPrice": "1.920"
}, {
"PartNo": "QT13\/35-4",
"UnitPrice": "1.770"
}]
}, {
"LineItemNo": "2",
"SolNo": "SPE8E7-15-T-4309",
"St": "O",
"Parts": [{
"PartNo": "F13DBX\/SPX35\/4P",
"UnitPrice": "1.890"
}, {
"PartNo": "CF13DD\/E\/835",
"UnitPrice": "1.920"
}, {
"PartNo": "QT13\/35-4",
"UnitPrice": "1.770"
}]
}]
}
我尝试了很多方法,但我无法找到一种方法来遍历源数组,在此过程中创建一个 Parts 数组,然后在后续迭代中将值插入该数组。我想做的是迭代源数组,检查$row['LineItemNo'] 值,如果它自上次迭代以来发生了变化,则创建一个新的顶级数组对象。如果没有,则创建一个新元素 Parts 数组。
我的基本代码如下所示(我意识到 mysql 已被 mysqli 或 PDO 弃用,但我暂时坚持使用它):
$result = mysql_query($query) or die(mysql_error());
$rs = array();
$rsParts = array();
while($row = mysql_fetch_array($result))
{
if (!isset($ln) || $row['LineItemNo'] != $ln)
{
$ln = $row['LineItemNo'];
$rs[data][] = array('LineItemNo' => $row['LineItemNo'], 'SolNo' => $row['SolNo'], 'St' => $row['St']);
$rs[data][parts] = array();
}
array_push($rs[data][parts], array('PartNo' => $row['PartNo'], 'UnitPrice' => $row['UnitPrice']));
}
这是一个好的开始,但它只给了我第一个元素中的部分,像这样:
{
"data": {
"0": {
"LineItemNo": "1",
"SolNo": "SPE8E7-15-T-1379",
"St": "O"
},
"parts": [{
"PartNo": "F13DBX\/SPX35\/4P",
"UnitPrice": "1.890"
}, {
"PartNo": "CF13DD\/E\/835",
"UnitPrice": "1.920"
}, {
"PartNo": "QT13\/35-4",
"UnitPrice": "1.770"
}],
"1": {
"LineItemNo": "2",
"SolNo": "SPE8E7-15-T-4309",
"St": "O"
}
}
}
我认为您不能以这种方式重新初始化数组。我尝试在 LineItemNo 更改时取消设置它,但这会将所有 Parts 元素变成顶级元素。我尝试只在开头使用is_array 初始化数组,但这会将所有部分放入第一个顶级元素(第一个中有六个部分,第二个没有)。
那么,做我想做的事情的正确方法是什么?
编辑:问题的解决方案是首先通过此代码发送结果集($result):
$array = array();
while($r = mysql_fetch_assoc($result))
{
$array[] = $r;
}
然后从那里使用 SML 的解决方案。
【问题讨论】:
标签: php multidimensional-array associative-array