Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 合并两个关联数组,其中第二个数组具有更多键?_Php_Arrays_Multidimensional Array_Merging Data - Fatal编程技术网

Php 合并两个关联数组,其中第二个数组具有更多键?

Php 合并两个关联数组,其中第二个数组具有更多键?,php,arrays,multidimensional-array,merging-data,Php,Arrays,Multidimensional Array,Merging Data,我一直在读这个问题,因为我有一个类似的挑战: 我有一个非常类似的问题,我试图将两个关联数组合并在一起,但它们在“父/子”模型中起作用,其中每个父数组可以有多个子数组 我正在做的工作是将一个新的基于云的EPOS系统与一个遗留的ERP集成,该ERP要求数据以特定的文件格式输出。每个事务都需要一个事务标题行(TH),然后在EPOS事务(TO)中为每个项目嵌套行 每个数组都是对视图进行Mysql查询的结果,我编写该查询是为了允许在运行时进行更短的“选择”查询。我正在迭代多个循环以收集事务数据,并将其作

我一直在读这个问题,因为我有一个类似的挑战:

我有一个非常类似的问题,我试图将两个关联数组合并在一起,但它们在“父/子”模型中起作用,其中每个父数组可以有多个子数组

我正在做的工作是将一个新的基于云的EPOS系统与一个遗留的ERP集成,该ERP要求数据以特定的文件格式输出。每个事务都需要一个事务标题行(TH),然后在EPOS事务(TO)中为每个项目嵌套行

每个数组都是对视图进行Mysql查询的结果,我编写该查询是为了允许在运行时进行更短的“选择”查询。我正在迭代多个循环以收集事务数据,并将其作为一个单独的进程写入数据库,该进程将按计划运行

源数据数组的示例如下(每个数组的var_dump):

父记录示例:

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系统要导入的输出文件。