0

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

合并两个多维关联数组

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

我正在做的工作是将基于云的新 EPOS 系统与需要以特定文件格式输出数据的传统 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) 数组中,但这必须从最终输出中省略。

因此,我在思考如何将多个 TO 行嵌套在每个相关的 TH 中时有些困难。

因此,管道分隔文件格式的示例是:

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

一切都在我的本地机器上写一个文件,但卡在这些阵列上。

4

1 回答 1

1

如果您想要的结果是将每个子元素分配给现有的父数组,您可以遍历它们中的每一个,将items数组添加到父数组,并检查将添加到items数组中的匹配 id。这样总会有一个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>';

这可能不完全适合,您也可以将一个嵌套循环用于输出并跳过合并部分,但这将使您能够在以后使用该数组,如果需要

于 2018-05-02T14:33:40.687 回答