Я читал этот вопрос здесь, так как у меня похожая проблема:
Слияние двух многомерных ассоциативных массивов
У меня очень похожая проблема, когда я пытаюсь объединить 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), массивы на данный момент, но это должно быть опущено в окончательном выводе.
В результате я немного пытаюсь придумать, как я могу вложить несколько строк TO в каждый соответствующий TH.
Таким образом, пример формата файла с разделителями трубы будет:
TH | 1 | х | хх | х | хх | х | х
К | 1 | х | ому | х | ому | х | х
К | 1 | х | ому | х | ому | х | х
TH | 2 | х | хх | х | хх | х | х
К | 2 | х | ому | х | ому | х | х
Все работает, чтобы написать файл на моей локальной машине, но застрял на этих массивах.
Если вы хотите, чтобы каждый дочерний элемент был назначен существующему родительскому массиву, вы можете просмотреть каждый из них, добавить items
массив к родителю, и проверьте для совпадающих идентификаторов, которые будут добавлены к 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>';
Это может быть не совсем точно, и вы можете альтернативно использовать один вложенный цикл для вывода и пропустить объединяющуюся часть, но это позволит вам использовать массив позже, если это необходимо
Других решений пока нет …