Объединение двух ассоциативных массивов, где второй массив имеет больше ключей php?

Я читал этот вопрос здесь, так как у меня похожая проблема:

Слияние двух многомерных ассоциативных массивов

У меня очень похожая проблема, когда я пытаюсь объединить 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 | х | ому | х | ому | х | х

Все работает, чтобы написать файл на моей локальной машине, но застрял на этих массивах.

0

Решение

Если вы хотите, чтобы каждый дочерний элемент был назначен существующему родительскому массиву, вы можете просмотреть каждый из них, добавить 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>';

Это может быть не совсем точно, и вы можете альтернативно использовать один вложенный цикл для вывода и пропустить объединяющуюся часть, но это позволит вам использовать массив позже, если это необходимо

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]