PHP中是否有一个函数可以合并两个多维关联数组?

时间:2018-12-31 20:09:41

标签: php multidimensional-array

请注意,我感谢您的答复。很抱歉回答迟到,自发布此消息以来我一直生病,而且我不清楚这个例子是否很清楚。让我们再试一次:

使用PHP,我有两个二维的关联数组,我想将所有字段组合成一个数组,请参见下面的示例

$ary_0[0]['name'] = 'Bobby', $ary_0[0]['address'] = '123 E Park Place'
$ary_0[1]['name'] = 'Chris', $ary_0[1]['address'] = '13 Bonanza Trail'
$ary_0[2]['name'] = 'Sally', $ary_0[2]['address'] = '97 West 3rd Ave.'

$ary_1[0]['name'] = 'Bobby', $ary_1[0]['phone'] = '555-555-1212'
$ary_1[1]['name'] = 'Chris', $ary_1[1]['phone'] = '222-555-1212'
$ary_1[2]['name'] = 'Sally', $ary_1[2]['phone'] = '999-555-1212'

使结果数组看起来像

$ary_2[0]['name'] = 'Bobby', $ary_2[0]['address'] = '123 E Park Place', $ary_2[0]['phone'] = '555-555-1212'
$ary_2[1]['name'] = 'Chris', $ary_2[1]['address'] = '13 Bonanza Trail', $ary_2[1]['phone'] = '222-555-1212'
$ary_2[2]['name'] = 'Sally', $ary_2[2]['address'] = '97 West 3rd Ave.', $ary_2[2]['phone'] = '999-555-1212'

请注意,两个阵列已经按名称排序,并且名称字段是两个阵列上的联接。实际上,该数据是从两个不同的数据库中提取的,并且通常无法以表的形式进行连接,但这就是我要寻求的效果。

PHP中是否有一个函数可以像这样合并这两个数组?我到处都是文献,但是除了强行使用名称值来寻找匹配项之外,找不到其他可行的解决方案。 有人在那里有一个优雅而简单的解决方案吗?我不相信array_merge()会起作用...

TIA, 迈克

2 个答案:

答案 0 :(得分:0)

由于它们已经按名称排序,您可以进行for循环并使用array_merge吗?

Private Sub TransferData()

Dim cellCount as long

Dim cell as range
Dim rangeToCopy as range

For each cell in  Sheets("sheet1").Range("A1:A6").SpecialCells(xlCellTypeConstants) ' 23 is unnecessary, as you get all XlSpecialCellsValue constants by default
' See https://docs.microsoft.com/en-us/office/vba/api/excel.range.specialcells
cellCount = cellCount + cell.cells.count

If not (rangeToCopy is nothing) then
Set rangeToCopy = application.union(rangeToCopy, cell)
Else
Set rangeToCopy = cell
End if

If cellCount = 3 then exit for

Next cell

If not (rangeToCopy is nothing) then
rangeToCopy.copy

Sheets("sheet2").Range("A1").PasteSpecial Paste:=xlPasteValues

Application.CutCopyMode = False

End if

End Sub

答案 1 :(得分:0)

假设您的代码只是一些伪代码,因此可以重写数组,以使每个人都更加清楚,而忽略了语法和重复的键错误。

$ary=[
    ['name'=>'Bobby','address'=>'123 E Park Place'],
    ['name'=>'Chris','address'=>'13 Bonanza Trail'],
    ['name'=>'Sally','address'=>'97 West 3rd Ave.'],
    ['name'=>'Bobby','phone'=>'555-555-1212'],
    ['name'=>'Chris','phone'=>'222-555-1212'],
    ['name'=>'Sally','phone'=>'999-555-1212']
];

这将为您提供几乎您目前的财产。

无法使用内置函数来完成此操作,这太具体了。 但是解决这个问题很简单。

$newArray=[];
foreach($ary as $key=>$val) {
    $found=false;
    foreach($newArray as $nKey=>$nVal) {
        if($nVal['name']==$val['name']) {
            $found=true;
            $newArray[$nKey]=array_merge($nVal,$val);
            break;
        }
    }
    if(!$found) $newArray[]=$val;
}

如果元素太多,需要更有效的方法,则应该重新设计数组或实现其他搜索算法,或者使用带有索引的数据库。

请注意,[]表示法仅适用于PHP +5.4。