首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:如何将一个关联数组合并为另一个多维数组的子数组

PHP:如何将一个关联数组合并为另一个多维数组的子数组
EN

Stack Overflow用户
提问于 2016-06-18 00:16:42
回答 2查看 213关注 0票数 2

我有一个平面的结果集,在JSON中如下所示:

代码语言:javascript
复制
[{
    "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"
}]

我想把它变成这样:

代码语言:javascript
复制
{
    "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数组。

我的基本代码如下所示(我意识到mysqli或PDO不推荐mysql,但我暂时无法使用它):

代码语言:javascript
复制
$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']));
}

这是一个很好的开始,但它只给了我第一个元素中的部分,如下所示:

代码语言:javascript
复制
{
    "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):

代码语言:javascript
复制
$array = array();
while($r = mysql_fetch_assoc($result))
{
    $array[] = $r;
}

然后使用SML的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-18 03:49:41

假设任何给定的LineItemNo总是与相同的SolNoSt配对,则可以将每一行的LineItemNo传递给函数,以检查结果数组$rs的子数组中是否存在该值。

如果LineItemNo不存在于$rs中,那么将创建$rs的一个新的第一级子数组,并将包含parts info的第二级子数组添加为第一级数组元素parts的sub_array。

如果LineItemNo确实存在,那么只需将parts info添加为第一级数组元素parts的sub_array。

因为在输出中需要顶级数组“数据”,所以在这个阶段没有做任何事情。

我从流程中去掉了这一点,而是在最后阶段将$rs添加到$output['data']中,以形成所需的输出。

代码语言:javascript
复制
$rs=array();
$counter=0;
while($r = mysql_fetch_assoc($results)) {
    $array[]=$r;
}

foreach ($array as $row) { 
  $part_info = array('part_no' => $row['PartNo'], 'unit_price' => $row['UnitPrice']);
  $temp=searchSub ($rs, $row['LineItemNo']);

    if ($temp===false){
       $rs[$counter] = array('LineItemNo' => $row['LineItemNo'], 'SolNo' => $row['SolNo'], 'St' => $row['St']);
       $rs[$counter]['parts'][] = $part_info;
       $counter++;
    }
    else {
        $rs[$temp]['parts'][]= $part_info;
    }
}
//function for subarray search
function searchSub($arr, $keyword){
    foreach($arr as $key=>$value)
    {
        if (in_array($keyword, $value, true)!=false){
        return $key;
        }
    }
    return false;
}
$output['data']=$rs;
print_r($output);

测试结果

票数 2
EN

Stack Overflow用户

发布于 2016-06-18 00:23:17

array_push是我通常的做法。你的代码读起来有点混乱(对用户不太友好),但我认为你很接近.

编辑:查看下面的内容。应该行得通。将您的while 更改为 foreach ,并按如下方式运行:

代码语言:javascript
复制
$rs = [];

foreach(mysql_fetch_array($result) as $key => $row) 
{
    $rs['data'][$key] = array('LineItemNo' => $row['LineItemNo'], 'SolNo' => $row['SolNo'], 'St' => $row['St']);

    $part_info = array('part_no' => $row['PartNo'], 'unit_price' => $row['UnitPrice']);
    $rs['data'][$key]['parts'] = $part_info;
}

print_r($rs);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37892050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档