Php 合并两个关联数组,其中第二个数组具有更多键?
我一直在读这个问题,因为我有一个类似的挑战: 我有一个非常类似的问题,我试图将两个关联数组合并在一起,但它们在“父/子”模型中起作用,其中每个父数组可以有多个子数组 我正在做的工作是将一个新的基于云的EPOS系统与一个遗留的ERP集成,该ERP要求数据以特定的文件格式输出。每个事务都需要一个事务标题行(TH),然后在EPOS事务(TO)中为每个项目嵌套行 每个数组都是对视图进行Mysql查询的结果,我编写该查询是为了允许在运行时进行更短的“选择”查询。我正在迭代多个循环以收集事务数据,并将其作为一个单独的进程写入数据库,该进程将按计划运行 源数据数组的示例如下(每个数组的var_dump): 父记录示例:Php 合并两个关联数组,其中第二个数组具有更多键?,php,arrays,multidimensional-array,merging-data,Php,Arrays,Multidimensional Array,Merging Data,我一直在读这个问题,因为我有一个类似的挑战: 我有一个非常类似的问题,我试图将两个关联数组合并在一起,但它们在“父/子”模型中起作用,其中每个父数组可以有多个子数组 我正在做的工作是将一个新的基于云的EPOS系统与一个遗留的ERP集成,该ERP要求数据以特定的文件格式输出。每个事务都需要一个事务标题行(TH),然后在EPOS事务(TO)中为每个项目嵌套行 每个数组都是对视图进行Mysql查询的结果,我编写该查询是为了允许在运行时进行更短的“选择”查询。我正在迭代多个循环以收集事务数据,并将其作
array(1)
{ [0]=> array(53)
{ ["Identifier"]=> string(2) "TH"
["Trans_ID"]=> string(9) "157976911"
["Trans_Date_Time"]=> string(19) "2017-10-19 11:38:13"
["Till_ID"]=> string(5) "30481"
["TILL_NAME"]=> string(5) "Till1"
["Cashier_Name"]=> string(12) "Cashier_Name"
["Branch_Ref"]=> string(5) "16783"
["Order_Number"]=> string(0) ""
["Original_Invoice"]=> string(0) ""
["Returns_Number"]=> string(0) ""
["Obselete1"]=> string(0) ""
["Obselete2"]=> string(0) ""
["Obselete3"]=> string(0) ""
["Obselete4"]=> string(0) ""
["Obselete5"]=> string(0) ""
["Obselete6"]=> string(0) ""
["Obselete7"]=> string(0) ""
["Obselete8"]=> string(0) ""
["Trans_Type"]=> string(4) "till"
["Trans_Status"]=> string(4) "sold"
["Customer_ID"]=> NULL
["Obselete9"]=> string(0) ""
["Customer_Ref"]=> string(0) ""
["Cust_Surname"]=> NULL
["Cust_Forename"]=> NULL ["Title"]=> NULL
["Cust_add1"]=> string(0) ""
["Cust_add2"]=> string(0) ""
["Cust_City"]=> string(0) ""
["Cust_State"]=> string(0) ""
}
}
和示例初始子记录[0]:
array(2)
{ [0]=> array(30)
{ ["tran_id"]=> string(9) "157976911"
["row_head"]=> string(2) "TO"
["sku"]=> string(0) ""
["barcode"]=> string(0) ""
["item_name"]=> string(12) "Merlot Large"
["item_style"]=> string(21) "250ml glass of Merlot"
["qty"]=> string(1) "1"
}
}
如上所述,子阵列用于EPOS事务上的每个产品,因此一个父级可以有多个子阵列。目前,我已经将事务ID包含在子(TO)数组中,但这必须从最终输出中写入
因此,我在思考如何将多行嵌套到每个相关TH中的行
因此,管道分隔文件格式的示例如下:
TH | 1 | x | xx | x | xx | x | x到| 1 | x | xx | x | xx | x | x
到| 1 | x | xx | x | xx | x | x
TH | 2 | x | xx | x | xx | x | x
到| 2 | x | xx | x | xx | x | x
一切都在我的本地计算机上写文件,但在这些数组上卡住了。如果您想要的结果是将每个子数组分配给现有的父数组,那么您可以遍历每个子数组,向父数组添加一个
项
数组,并检查将添加到项
数组的匹配ID。这样,将始终存在项
,但如果没有匹配项,则该项将为空,从而允许您也为输出运行类似的循环
// load the child-items into your existing parent array
foreach ($parentArray as $key => $parent) {
$parentArray[$key]['items'] = array();
foreach($childArray as $child) {
if ($parent['Trans_ID'] == $child['tran_id']) {
$parentArray[$key]['items'][] = $child;
}
}
}
echo '<table>';
// loop through again for output
foreach ($parentArray as $parent) {
echo '<tr>';
echo '<th>'.$parentArray['identifier'].'</th>';
echo '<th>'.$parentArray['another-field'].'</th>';
echo '<th>'.$parentArray['another-field'].'</th>';
echo '</tr>';
foreach ($parent['items'] as $item) {
echo '<tr>';
echo '<td>'.$item['sku'].'</td>';
echo '<td>'.$item['another-field'].'</td>';
echo '<td>'.$item['another-field'].'</td>';
echo '</tr>';
}
}
echo '</table>';
//将子项加载到现有父数组中
foreach($parentArray作为$key=>$parent){
$parentArray[$key]['items']=array();
foreach($childArray作为$child){
if($parent['Trans\u ID']=$child['Trans\u ID'])){
$parentArray[$key]['items'][]=$child;
}
}
}
回声';
//再次循环输出
foreach($parentArray作为$parent){
回声';
回显'.$parentArray['identifier'].';
回显'.$parentArray['other-field'].';
回显'.$parentArray['other-field'].';
回声';
foreach($parent['items']作为$item){
回声';
回显'.$item['sku'].';
回显'.$item['other-field'].';
回显'.$item['other-field'].';
回声';
}
}
回声';
这可能不是一个精确的匹配,您也可以使用一个嵌套循环作为输出并跳过合并部分,但这将使您能够在以后使用阵列,如果需要您可以添加一个预期结果的示例吗?@mtr.web Thx,已使用示例进行了编辑&更详细一些。谢谢您的编辑。然而,我指的是结果数组的一个示例。我认为您正在寻找一个以父数组开始的最终数组,并根据匹配的Trans\u ID/Trans\u ID添加一个新字段,例如
items
,该字段将是所有子项的数组。您可以验证吗?您是否可以将当前尝试的代码添加到这个问题中?我不太确定你是被代码卡住了还是仅仅是文件格式。很有趣,谢谢。我来看看这方面的工作。我可能会错过输出部分,因为一旦填充并合并了阵列,我就可以将它们作为变量传递给fputcsv流程,以生成ERP系统要导入的输出文件。