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

时间:2018-05-02 12:47:26

标签: php arrays multidimensional-array merging-data

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

Merging two multidimensional associative arrays

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

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

每个数组都是对我所写的视图进行Mysql查询的结果,以便缩短' select'在运行时查询。我正在迭代多个循环来收集事务数据并将其作为一个单独的进程写入我的数据库,该进程将按计划运行。

作为源数据数组的示例如下(每个的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事务中的每个产品的,因此一个父项可以有多个子数组。我已经在子(TO)中包含了事务ID,现在是数组,但是必须从最终输出中省略它。

因此,我正在努力思考如何在每个相关的TH中嵌套多个TO行。

所以管道分隔文件格式的一个例子是:

TH | 1 | X | XX | X | XX | X | X
TO | 1 | X | XX | X | XX | X | X
TO | 1 | X | XX | X | XX | X | X
TH | 2 | X | XX | X | XX | X | X
TO | 2 | X | XX | X | XX | X | X

一切正在我的本地机器上写一个文件,但却停留在这些阵列上。

1 个答案:

答案 0 :(得分:1)

如果您希望的结果是将每个子节点分配给现有的父数组,则可以循环遍历每个子节点,向父节点添加items数组,并检查将添加的匹配ID到items数组。这样总会有一个items,但是如果没有匹配则它会为空,允许你为你的输出运行一个类似的循环。

// 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>';

这可能不完全合适,你也可以使用一个嵌套循环来输出并跳过合并部分,但如果需要,这可以让你以后使用数组